我正在尝试使用ggplot2库创建一个时间轴,其代码如下:
library(ggplot2)
data <- read.csv("Data.csv", header = TRUE, sep = ",")
data$Date <- as.Date(data$Date)
xnow <- Sys.Date()
Names <- unique(data$Name)
i <- 0
plot<-ggplot(data,aes(x=Date,y=Name))+geom_point(aes(colour = factor(Event)))
for(i in 1:length(Names)){
personname <- Names[i]
xstart <- data[which(data$Event=="start" & data$Name== personname),]$Date
xfinal <- data[which(data$Event=="end of engagement" & data$Name== personname),]$Date
plot<-plot+geom_point(aes(x = Sys.Date(), y = personname), colour = "green", size = 3)
plot<-plot+geom_segment(aes(x=xstart ,xend=xnow,y = personname, yend = personname))
plot<-plot+geom_segment(aes(x=xnow ,xend=xfinal,y = personname, yend = personname), linetype = 2)
}
在第一次迭代之后,我得到了名称&#34; devanshu&#34;的预期线段。在第二次迭代期间,名称&#34; devanshu&#34;的前一个线段一旦执行第一个迭代命令,它就会消失。数据:
Name Date Event
devanshu 2/2/2016 start
devanshu 3/2/2016 first self assessment
devanshu 6/3/2016 first 360 assessment
devanshu 12/7/2016 end of engagement
Priya 4/2/2016 start
Priya 6/3/2016 first self assessment
Priya 10/4/2016 first 360 assessment
Priya 2/7/2017 end of engagement
问题在于代码还是逻辑?
答案 0 :(得分:0)
使用 ggplot2 时,重塑数据集通常最简单,而不是使用循环。但请参阅here了解其他想法。
在这种情况下,您需要第二个数据集来添加宽格式的细分,以便您可以使用geom_segment
和start
作为变量来设置end of engagement
的终点。
在这里,我使用 tidyr 中的spread
创建此数据集。
library(tidyr)
widedat = spread(data, Event, Date)
widedat
Name end of engagement first 360 assessment first self assessment start
1 devanshu 2016-12-07 2016-06-03 2016-03-02 2016-02-02
2 Priya 2017-02-07 2016-10-04 2016-06-03 2016-04-02
现在,您可以使用此新数据集添加geom_segment
图层。
ggplot(data, aes(x = Date, y = Name)) +
geom_point(aes(colour = factor(Event))) +
geom_point(aes(x = Sys.Date()), colour = "green", size = 3) +
geom_segment(data = widedat, aes(x = start, xend = Sys.Date(),
yend = Name)) +
geom_segment(data = widedat, aes(x = Sys.Date(), xend = `end of engagement`,
yend = Name), linetype = 2)