如何在 R 中使用“组”创建分段图表
Posted
技术标签:
【中文标题】如何在 R 中使用“组”创建分段图表【英文标题】:How to create a segmentation chart with 'group' in R 【发布时间】:2021-10-18 21:35:29 【问题描述】:我有这样的数据集
又想画一个类似这样的分割图
这将是其中一个组的示例,因此基于数据集,我有 A 组和 B 组,我希望有两个分段图表显示所有组,每个组都有自己的分段图表来显示每个任务开始时间和结束时间,每个任务可能在每个组中出现多次。我有以下代码用于显示 A 组,对在同一张图表中的子图 B 组有什么建议吗?基本上是如何使用组列来完成图表。 现在图表混合了 A 组和 B 组,但我想将它们区分开来有两个单独的分段图表
category <- c('task1', 'task2', 'task2','task1','task1')
start_min <- c(0, 0, 16, 45, 40)
stop_min <- c(14.9,18.8,17.5,65.5, 70)
group <- c('A', 'B', 'A', 'A', 'B')
data <- data.frame(category,start_min,stop_min,group)
task_bars <- ggplot(data, mapping=aes(ymin=0, ymax=1,
xmin=start_min, xmax=stop_min,
fill=as.factor(category),
text=paste("Task:", str_wrap(string = category, width = 70,),
"<br>Start: ", format(start_min, digits=1), "min",
"<br>Stop: ", format(stop_min, digits=1), "min")
)) +
geom_rect(alpha=0.8) +
theme_minimal()+
theme(
axis.title.x=element_text(color="white"), axis.text.x=element_text(color="white"),
axis.text.y=element_blank(), axis.ticks.y=element_blank(),
panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.border = element_blank(), panel.background = element_blank()) +
scale_fill_discrete(breaks=data$category)
task_bars <- plotly::ggplotly(proc_bars, tooltip="text", width = 970, height = 120) %>%
plotly::config(displayModeBar = TRUE) %>%
plotly::layout(plot_bgcolor='black', paper_bgcolor='black', margin = list(b=30, l=0, r=10, t=30))
print(task_bars)
【问题讨论】:
请不要发布数据图像(请参阅meta.***.com/a/285557(和xkcd.com/2116)),要求我们转录您已经拥有的内容显得很懒惰。请发布真实数据,data.frame(...)
代码或dput(head(x,20))
的输出(仅提供足够的数据来尝试绘图,仅此而已)。谢谢
已重新编辑,感谢您的建议!
task_bars + facet_grid(group ~ .)
?
仅供参考,proc_bars
未找到
谢谢@r2evans,是的,proc_bars 是 task_bars
【参考方案1】:
想到了两种方法。我将分别展示 ggplot 和 plotly 图。
(仅供参考,我假设 proc_bars
实际上只是之前定义的 task_bars
。如果 proc_bars
完全不同,这可能不适用。)
刻面
变化
将facet_grid(group ~ .)
添加到情节中
library(ggplot2)
bars1 <- ggplot(data, mapping=aes(ymin=0, ymax=1, xmin=start_min, xmax=stop_min,
fill=as.factor(category))) +
geom_rect(alpha=0.8) +
theme_minimal() +
theme(
axis.title.x=element_text(color="white"), axis.text.x=element_text(color="white"),
axis.text.y=element_blank(), axis.ticks.y=element_blank(),
panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.border = element_blank(), panel.background = element_blank()) +
scale_fill_discrete(breaks=data$category) +
facet_grid(group ~ .)
plotly::ggplotly(bars1, tooltip="text", width = 970, height = 120) %>%
plotly::config(displayModeBar = TRUE) %>%
plotly::layout(plot_bgcolor='black', paper_bgcolor='black', margin = list(b=30, l=0, r=10, t=30))
将“组”移动到 y 轴
此方法更改为使用geom_tile
,将group
作为y 轴。默认为height=1
,这会将瓷砖放置在中间;我正在设置 height=0.9
来模拟它们之间的一些间距。
变化:
从geom_rect
更改为geom_tile
,需要添加xcenter
和xwidth
注释掉两个主题元素,以便显示 y 轴刻度
添加labs(y=NULL)
隐藏“组”y 轴名称,交给你
# this can be done without `dplyr` if desired
data2 <- dplyr::mutate(data, xwidth = stop_min - start_min, xcenter = start_min + xwidth/2)
bars2 <- ggplot(data2, mapping=aes(x=xcenter, y=group, width=xwidth, height=0.9, fill=as.factor(category))) +
geom_tile(alpha=0.8) +
theme_minimal() +
theme(
axis.title.x=element_text(color="white"), axis.text.x=element_text(color="white"),
# axis.ticks.y=element_blank(), axis.text.y=element_blank(),
panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
panel.border = element_blank(), panel.background = element_blank()) +
labs(y = NULL) +
scale_fill_discrete(breaks=data$category)
plotly::ggplotly(bars2, tooltip="text", width = 970, height = 120) %>%
plotly::config(displayModeBar = TRUE) %>%
plotly::layout(plot_bgcolor='black', paper_bgcolor='black', margin = list(b=30, l=0, r=10, t=30))
注意事项:
ggplot2
将按字母顺序排列刻面或 y 刻度;如果您需要不同的顺序,请将group
更改为factor
,并且您必须将factor(group, levels=***)
级别组件显式控制为您需要的唯一值的顺序。
bars1
和bars2
之间的组顺序颠倒了;这是因为在bars1
中,刻面从上到下递增,因此“最小”在顶部;在bars2
中,组从底部(y = 1)到顶部(y = n)递增,因此“最小”位于底部;有几种方法可以控制它,包括上面的factor
注释
【讨论】:
刻面问题确实有效!我还尝试了第二个,它向我显示错误“错误:美学必须是长度 1 或与数据 (7) 相同:xmin、xmax 和文本运行rlang::last_error()
以查看错误发生的位置。”跨度>
对于您的错误,我不知道...考虑到这些数据(以及我对 data
的处理),它对我有用。以上是关于如何在 R 中使用“组”创建分段图表的主要内容,如果未能解决你的问题,请参考以下文章