如何在 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,需要添加xcenterxwidth 注释掉两个主题元素,以便显示 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=***) 级别组件显式控制为您需要的唯一值的顺序。

bars1bars2 之间的组顺序颠倒了;这是因为在bars1 中,刻面从上到下递增,因此“最小”在顶部;在bars2 中,组从底部(y = 1)到顶部(y = n)递增,因此“最小”位于底部;有几种方法可以控制它,包括上面的factor 注释

【讨论】:

刻面问题确实有效!我还尝试了第二个,它向我显示错误“错误:美学必须是长度 1 或与数据 (7) 相同:xmin、xmax 和文本运行rlang::last_error() 以查看错误发生的位置。”跨度> 对于您的错误,我不知道...考虑到这些数据(以及我对 data 的处理),它对我有用。

以上是关于如何在 R 中使用“组”创建分段图表的主要内容,如果未能解决你的问题,请参考以下文章

如何在R中重叠两个图表?

为啥我在这个迭代器中遇到分段错误?

如何在 R 中跨多个字段创建简单的交叉表

如何在R中一起创建折线图和条形图[重复]

如何在 R 中拟合分段回归,并限制第一次拟合通过截距..?

R ggplot - 如何将这两个直方图组合成一个整体直方图进行比较?