使用ggplot在R中创建堆叠的“进度条”条形图

3

我正在寻找一种使用ggplot创建堆叠条形图变体的方法。更像是“进度条”图表。 我的x轴上有日期,y轴上有一个分类变量“activity”。每个活动都有“红色”,“黄色”或“绿色”的状态。我想绘制每个活动的状态随时间的变化情况。问题在于我没有提供数字输入,并且日期的显示方式很奇怪,而且也不是按时间顺序显示。希望您可以通过查看下面的图表和代码来了解我尝试做什么的想法:

activity    date     status
a          11-10-21   red
a          11-17-21   red
a          11-24-21   yellow
a          12-01-21   green
b          11-10-21   red
b          11-17-21   yellow
b          11-24-21   green
b          12-01-21   green
c          11-10-21   yellow
c          11-17-21   green
c          11-24-21   green
c          12-01-21   green

这里是我的生成图表的代码。

activity <- c("a", "a", "a", "a", "b", "b", "b", "b", "c", "c", "c", "c")
date <- c("2021-11-10", "2021-11-17", "2021-11-24", "2021-12-01", "2021-11-10", "2021-11-17", 
"2021-11-24", "2021-12-01", "2021-11-10", "2021-11-17", "2021-11-24", "2021-12-01")
status <- c("red", "red", "yellow", "green", "red", "yellow", "green", "green", "yellow", 
"green", "green", "green")


df <- data.frame(activity, date, status)

df$activity <- as.factor(df$activity)
df$date <- as.Date(df$date)
df$status <- as.factor(df$status)

ggplot(df, aes(x=date, y=activity, fill = status)) + geom_bar(stat = "identity") +
scale_fill_manual(values = c("#6FC750", "#CC5939", "#D1CB28"))

enter image description here

1个回答

3

实现您所需的结果的一个选择是切换到geom_rect

由于您有一个要映射到y的分类列,我将其转换为数字,这需要将标签放回现在连续的比例尺上。

library(ggplot2)
library(dplyr)
library(lubridate)

df <- df %>% 
  mutate(date_end = date + lubridate::days(7))

width = .6

breaks <- seq(levels(factor(activity)))
labels <- levels(factor(activity))
ggplot(df, aes(fill = status)) + 
  geom_rect(aes(xmin = date, xmax = date_end, 
                ymin = as.numeric(factor(activity))  - width / 2, 
                ymax = as.numeric(factor(activity))  + width / 2)) +
  scale_y_continuous(breaks = breaks, labels= labels) +
  scale_fill_manual(values = c("#6FC750", "#CC5939", "#D1CB28"))

抱歉,我只能用文字回答问题。您可以将需要翻译的内容发送给我。
set.seed(42)

df <- df %>% 
  mutate(date_end = date + lubridate::days(sample(3:7, nrow(.), replace = TRUE)))

width = .6

breaks <- seq(levels(factor(activity)))
labels <- levels(factor(activity))
ggplot(df, aes(fill = status)) + 
  geom_rect(aes(xmin = date, xmax = date_end, 
                ymin = as.numeric(factor(activity))  - width / 2, 
                ymax = as.numeric(factor(activity))  + width / 2)) +
  scale_y_continuous(breaks = breaks, labels= labels) +
  scale_fill_manual(values = c("#6FC750", "#CC5939", "#D1CB28"))


非常感谢,那个有效。有没有办法我可以用黑色轮廓线勾画出构成整个条形的每个矩形的轮廓呢? - bodega18
1
当然:geom_rect(aes(...), color = "black") - stefan
还有一件事。是否有办法填补矩形之间的任何间隙(例如,如果日期不是相隔一周)? - bodega18
是的。需要的是一个开始日期和结束日期,即可以使用可变的结束日期来填充此列,而不是固定的“date_end”。请参见我的编辑,我在其中使用了一些随机的结束日期。 - stefan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接