【问题标题】:Creating a timeline in ggplot在 ggplot 中创建时间线
【发布时间】:2017-01-20 00:19:34
【问题描述】:

在下面编辑了完整且可运行的代码:

我正在尝试创建一个类似于此代码从 Timeline 包创建的时间线,但是,选项不是很灵活。例如,我想在每个条之间创建空间,这样它们就不会接触。另外,我想知道是否有一种方法可以将“End_Status”列添加到图表中,这样很明显数据会因为动物死亡而停在那里。非常感谢任何帮助。

示例数据集:

df <- data.frame(id = c(rep(1201, 10), rep(1202, 14), rep(1203, 6),     rep(1204, 22)),
             date = c(seq(1,5,1), seq(5,7,1), seq(7,8,1), seq(2,5,1), seq(7,9,1), seq(11,17,1), seq(1,8,1), seq(8,12, 1), seq(12,26,1 )),
             schedule = as.factor(c(rep(1, 5,), rep(2, 3), rep(3, 6), 
                                 rep (1, 3), rep (2, 2), rep(3, 5),
                                 rep(1,8), rep(2, 5), rep(1,3), rep(3, 12))),
             status = c(rep("", 9), "Mort", rep("", 41), "Mort"))

获取我感兴趣的输出表的代码:

library("data.table")
library(plyr)
library(dplyr)

df<-as.data.table(df)
z <- df[, unique(id)]
################
value_change_first <- function(x,a) { for(i in 1:length(x[,schedule])) {
ifelse(x[a,schedule] == x[a+1,schedule], 
       x <- x[-(a+1)], 
       a <- a+1)}
return(x)
}

value_change_second <- function(x,a) { 
for(i in 1:length(x[,schedule])) {
ifelse(x[a,schedule] == x[a+1,schedule], 
       x <- x[-(a)], 
       a <- a+1)}
return(x)
}

#################
output_1 <- c()

for(i in 1:length(z)){
ids <- df[df$id==z[i],]
out<-value_change_first(ids,1)
output_1<-as.data.frame(rbind(output_1, out))}

#################
output_2 <- c()

for(i in 1:length(z)){
ids <- df[df$id==z[i],]
out<-value_change_second(ids,1)
output_2<-as.data.frame(rbind(output_2, out))}

################
output_1$End_Date <- output_2$date
output_1$End_Status <- output_2$status
names(output_1)[names(output_1)=="date"] <- "Start_Date"

output <- output_1[c(1:2, 5, 3, 6)]

从这里我可以使用时间轴包来获得接近我想要的东西:

require(timeline)
tl <- timeline(output, 
           label.col=names(output)[4],
           text.color= NA,
           group.col=names(output)[1],
           start.col=names(output)[2],
           end.col = names(output)[3])
tl + theme_bw() + theme(panel.grid.major = element_blank(), panel.grid.minor    = element_blank())

我的问题是如何在 ggplot 中构建类似的东西。此外,我想在给定日期由个人从输出数据框中专门添加“Mort”消息。

我最终让它像我想要的那样工作:

### creating a end status column that includes mortalities and failures
output$End_Status_Date<-NA
for(i in 1:nrow(output)){
if(output$End_Status[i] == "Mort"){
output$End_Status_Date[i]=as.character(output$End_Date)[i] 
}
}

for(i in 1:nrow(output)){
if(output$End_Status[i] == "Failure"){
output$End_Status_Date[i]=as.character(output$End_Date)[i] 
}
}

### data structuring
output$id<-as.factor(output$id)
output$End_Status_Date<-as.numeric(output$End_Status_Date)
output$End_Status[output$End_Status == ""] <- NA
output$End_Status<-as.character(output$End_Status)
output$End_Status<-as.factor(output$End_Status)

library(ggplot2)

g2 <- ggplot() +
geom_segment(data=output, aes(x=Start_Date, xend=End_Date, y=id, yend=id,    color=schedule), linetype=1, size=2) +
geom_point(data=subset(output, is.na(End_Status)==FALSE), 
         mapping=aes(x=End_Status_Date, y=id, shape=End_Status,   fill=End_Status), size=4)+
scale_colour_manual(values=c("blue4", "chartreuse4", "darkmagenta"))+
scale_fill_manual(values=c("white", "red"))+ 
scale_shape_manual(values=c(21,24))+ 
xlab("Time")+
ylab("Individuals")+
theme_bw() + theme(panel.grid.minor = element_blank(), panel.grid.major =   element_blank())

g2

【问题讨论】:

  • 您能展示一下您使用 ggplot 尝试过的内容吗?
  • 用最终产品编辑了原始帖子。

标签: r ggplot2 timeline


【解决方案1】:

您已经完成了大部分工作。这里的关键是使用geom_rect 并利用您的 y 轴标签来设置 ymin 和 ymax 值。

ggplot(output, aes(xmin = Start_Date, xmax = End_Date, 
                   ymin = as.numeric(id) - 1, ymax = as.numeric(id), 
                   fill = schedule)) + 
  geom_rect() +
  geom_text(aes(x = End_Date, y = id, label = End_Status))

【讨论】:

  • 优秀。如果这个答案对你有帮助,请接受它是正确的:)
  • 用最终产品编辑了原始帖子
  • 就我而言,id 是一个因素。将y=id 放在主要的aes 中很有用。这处理了正确的垂直轴标签。
猜你喜欢
  • 1970-01-01
  • 2021-02-06
  • 1970-01-01
  • 2019-03-20
  • 1970-01-01
  • 2022-08-14
  • 2015-04-17
  • 1970-01-01
  • 2014-08-09
相关资源
最近更新 更多