将气泡添加到甘特图以指示结束日期是否已发生 ggplot2

Adding bubbles to a gantt chart to indicate whether an end date has happened or not ggplot2

我正在创建甘特图来监测临床试验的不良事件。我创建了一个甘特图,绘制了从他们在研究中的注册日期起,对于每个不良事件,不良事件开始和结束的天数。然而,一些不良事件还没有结束,所以我希望添加一些冒泡来指示开始和结束,如果结束真的发生了。我附上了一张我在网上找到的示例照片,以实现我想要实现的目标。您可以看到 ECG-Twave 反转和咳嗽,没有气泡表明不良事件仍在进行中。

我在下面附上了我的数据集和代码。现在,为了获得柱的长度,如果结束日期为 NA(表示事件仍在进行中),我已将其替换为今天的日期。我很好奇是否有一种方法可以仅在由结果变量确定的结束日期发生时才将气泡添加到条形图的开始和结束。换句话说,我希望在每个条形图的开头有一个气泡,并且只在事件 1、2 和 4 的末尾有一个气泡。由于事件 3 和 5 的结果为“未解决”,因此它们不会出现气泡最后。

data <- data.frame(aeterm = c("event1", "event2", "event3", "event4", "event5"),
                   grade = c("mild", "severe", "mild", "severe", "severe"),
                   outcome = c("resolved", "resolved", "not resolved", "resolved", "not resolved"),
                   aestartdate = c(1, 5, 4, 5, 10),
                   aeenddate = c(5, 10, 6, 20, 30))

data_long <- data %>%
  select(aeterm, grade, outcome, aestartdate, aeenddate) %>%
  gather(date.type, task.date, -c(aeterm, grade, outcome)) %>%
  arrange(date.type, task.date)

theme_gantt <- function(base_size=11, base_family="Source Sans Pro Light") {
  ret <- theme_bw(base_size, base_family) %+replace%
    theme(panel.background = element_rect(fill="#ffffff", colour=NA),
          axis.title.x=element_text(vjust=-0.2), axis.title.y=element_text(vjust=1.5),
          title=element_text(vjust=1.2, family="Source Sans Pro Semibold"),
          panel.border = element_blank(), axis.line=element_blank(),
          panel.grid.minor=element_blank(),
          panel.grid.major.y = element_blank(),
          panel.grid.major.x = element_line(size=0.5, colour="grey80"),
          axis.ticks=element_blank(),
          legend.position="bottom",
          axis.title=element_text(size=rel(0.8), family="Source Sans Pro Semibold"),
          strip.text=element_text(size=rel(1), family="Source Sans Pro Semibold"),
          strip.background=element_rect(fill="#ffffff", colour=NA),
          panel.spacing.y=unit(1.5, "lines"),
          legend.key = element_blank())
  
  ret
}

x.breaks <- seq(length(data_long$aeterm) + 0.5 - 3, 0, by=-3)
timeline <- ggplot(data_long, aes(x=aeterm, y=task.date, colour=grade)) +
  geom_line(size=6) +
  geom_vline(xintercept=x.breaks2, colour="grey80", linetype="dotted") +
  guides(colour=guide_legend(title=NULL)) +
  labs(x=NULL, y=NULL) + coord_flip() +
  # scale_y_date(date_breaks="1 months", labels=date_format("%b ‘%y")) +
  theme_gantt() + theme(axis.text.x=element_text(angle=45, hjust=1))
timeline

最后试试这个方法。您可以使用带有 geom_point() 的原始 data 来根据使用 outcome 变量的条件添加气泡样式。这里的代码:

library(ggplot2)
#Code
timeline <- ggplot(data_long, aes(x=aeterm, y=task.date, colour=grade)) +
  geom_line(size=6) +
  geom_point(data=data,aes(y=aestartdate,x=aeterm,fill=grade),
             color='black',size=5,shape=21,show.legend = F)+
  geom_point(data=data,aes(y=ifelse(outcome=='resolved',aeenddate,NA),
                           x=ifelse(outcome=='resolved',aeterm,NA),fill=grade),
             color='black',size=5,shape=21,show.legend = F)+
  geom_vline(xintercept=x.breaks, colour="grey80", linetype="dotted") +
  guides(colour=guide_legend(title=NULL)) +
  labs(x=NULL, y=NULL) + coord_flip() +
  theme_gantt() + theme(axis.text.x=element_text(angle=45, hjust=1))

输出:

另一种选择是:

timeline + 
  geom_point(data = subset(data_long, date.type == "aestartdate" | 
                             outcome == "resolved"),
             shape = 21, size = 8, aes(fill = grade), color = "black") +
  guides(fill = guide_none())