每次迭代都会改变ggplot

时间:2016-07-13 20:48:07

标签: r plot ggplot2

我正在尝试使用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

问题在于代码还是逻辑?

1 个答案:

答案 0 :(得分:0)

使用 ggplot2 时,重塑数据集通常最简单,而不是使用循环。但请参阅here了解其他想法。

在这种情况下,您需要第二个数据集来添加宽格式的细分,以便您可以使用geom_segmentstart作为变量来设置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)

enter image description here