使用R

时间:2015-09-08 14:46:02

标签: r ggplot2 boxplot

我试图创建一个包含项目各个阶段的多项目时间表,以便在一个易于想象的地方组织我们当前的所有项目。

我最初找到了timeline()包,并能够半创造我所希望的。但是,似乎包不是很可定制的,所以我希望在ggplot2()中完成我的时间表。

这是我的假数据:

Phase Project StartDate EndDate  
SD Test1 2015-08-01 2015-08-31  
DD Test1 2015-08-31 2015-09-30  
CD Test1 2015-09-30 2015-11-14  
PC Test1 2015-11-14 2015-12-14  
CA Test1 2015-12-14 2016-08-10  
SD Test2 2015-09-01 2015-10-01  
DD Test2 2015-10-01 2015-10-31  
CD Test2 2015-10-31 2015-12-15  
PC Test2 2015-12-15 2016-01-14  
CA Test2 2016-01-14 2017-01-08  
SD Test3 2016-01-01 2016-01-13  
DD Test3 2016-01-13 2016-01-25  
CD Test3 2016-01-25 2016-02-12  
PC Test3 2016-02-12 2016-03-13  
CA Test3 2016-03-13 2017-01-07  
SD Test4 2015-06-01 2015-06-01  
DD Test4 2015-06-01 2015-06-01  
CD Test4 2015-06-01 2015-06-01  
PC Test4 2015-06-01 2015-07-01  
CA Test4 2015-07-01 2015-07-01  
SD Test5 2015-05-01 2015-05-25  
DD Test5 2015-05-25 2015-06-18  
CD Test5 2015-06-18 2015-07-24  
PC Test5 2015-07-24 2015-08-23  
CA Test5 2015-08-23 2015-08-23  

正如您所看到的,每个项目都列出了5个阶段(SD,DD,CD,PC,CA),即使某些项目(Test4)没有几个阶段,因为它们目前列出了相同的日期。

当我用timeline()运行我的代码时,这就是我得到的:

    data$StartDate<- as.Date(data$StartDate)
    data$EndDate<- as.Date(data$EndDate)
    timeline(data, text.size=4)

Result

正如您所看到的,在某些情况下,相位会重叠,我无法调整字体或将文本置于各自的框中。

因此,我试图转移到ggplot,但无法弄清楚如何使其与此时间轴类似。

到目前为止,这是我的新代码:

ggplot(data,aes(x=data$StartDate, y=data$Project)) +
  geom_line()+
  geom_point()+
  geom_text(aes(label=data$Phase), hjust=0,vjust=0)

Result2

目前看来,xlim太小,无法显示我的几个项目的整个CA阶段。此外,我希望能够自定义文本,按最近的开始日期重新排序到最新,更改xlab和ylab以及我认为不可能在timleline()中进行的其他图形更改包。

感谢您提供的任何帮助,如果您需要任何澄清,请与我们联系!

1 个答案:

答案 0 :(得分:3)

我选择使用分段而不是功能区,因为它的直线和分段更易于使用离散的y轴。

#make ordered factor so that sequence in legend matches sequence in plot
data$Phase_ordered <- factor(data$Phase,levels=c("SD","DD","CD","PC","CA"))

p1 <- ggplot(data,aes(x=StartDate, y=Project, color=Phase_ordered)) +
  geom_segment(aes(x=StartDate,xend=EndDate,yend=Project),size=15) +
 scale_colour_discrete(guide=guide_legend(override.aes=list(size=7))) #or legend will be too big
p1

enter image description here