Eri*_*ail 4 time plot visualization r ggplot2
我正在研究一些室内和室外活动的相当精细的情节,我有点卡住了.我想添加着色用了室内/室外用(纪要Xmin,Ymin以及Zmin中)geom_segment我的阴谋的步骤(见下文).它目前仅 Zmin被着色(使用连续变量,有点关闭).
我粘贴了所有代码以防其他人想要构建这样的东西,我最初的灵感来自这篇博文.
任何帮助将不胜感激,谢谢!
df <- data.frame(
date = seq(Sys.Date(), len= 156, by="4 day")[sample(156, 26)],
action = paste('Then', LETTERS[1:13], 'happed, which was not related to', LETTERS[14:26]),
IndoorOutdoor = rep(c(-1,1), 13),
Xmin = sample(90, 26, replace = T),
Ymin = sample(90, 26, replace = T),
Zmin = sample(90, 26, replace = T)
)
df$XYZmin <- rowSums(df[,c("Xmin", "Ymin", "Zmin")])*df$IndoorOutdoor
# install.packages("ggplot2", dependencies = TRUE)
require(ggplot2)
# step 1
plot <- ggplot(df,aes(x=date,y=0))
# step 2, this is where I want to add 'more' color
plot <- plot + geom_segment(aes(y=0,yend=XYZmin,xend=date, colour= Zmin))
# The text is added as follows
plot <- plot + geom_text(aes(y=XYZmin,label=paste(action, '\n this happed on ', date)),size=2.5,hjust=-.01, vjust=-.01, angle = 35)
# points at the end of the line segments
plot <- plot + geom_point(aes(y=XYZmin))
# #raw a vertical line
plot <- plot + geom_hline(y=0,size=1,color='purple')
#drawing the actual arrow
# plot <- plot + geom_segment(x=2011.4,xend=2012.2,y=.2,yend=0,color='purple',size=1) + geom_segment(x=2011.4,xend=2012.2,y=-.2,yend=0,color='purple',size=1)
plot <- plot + theme(axis.text.y = element_blank()) + ylab('') + xlab('')
plot + labs(title = "Timeline for when what happened")
Run Code Online (Sandbox Code Playgroud)

这有两种方法.一个构造出不同geom_segments的每一行(我认为这更接近你正在做的事情?)另一个只是使用geom_bar,这将是我的偏好(更加可扩展).我认为在构建你的时候会出现错误 - 当你data.frame创建时会创建56行IndoorOutdoor,这会在以后产生问题.我在下面改了.
set.seed(1234)
df <- data.frame(
date = seq(Sys.Date(), len= 156, by="4 day")[sample(156, 26)],
action = paste('Then', LETTERS[1:13], 'happed, which was not related to', LETTERS[14:26]),
IndoorOutdoor = rep(c(-1,1), 13), #Change so there are only 26 rows
Xmin = sample(90, 26, replace = T),
Ymin = sample(90, 26, replace = T),
Zmin = sample(90, 26, replace = T)
)
df$XYZmin <- rowSums(df[,c("Xmin", "Ymin", "Zmin")])*df$IndoorOutdoor
df[,8:10] <- df[,4:6]*df[,3] #Adding the sign to each X/Y/Z
names(df)[8:10] <- paste0(names(df)[4:6],"p") #to differentiate from your X/Y/Z
require(ggplot2)
Run Code Online (Sandbox Code Playgroud)
对于geom_bar解决方案,我然后融化,df以便可以绘制单个值,并fill映射到varialbe(Xmin等)
df.m <- melt(df[,c(1:3,7:10)], measure.vars=c("Xminp", "Yminp", "Zminp"))
plot.alt <- ggplot(df.m, aes(date, value, fill=variable)) +
geom_bar(position="stack", stat="identity", width=0.5) + #width is just to make it look like yours
#All of this is from your original plot
geom_text(aes(y=XYZmin,label=paste(action, '\n this happed on ', date)),size=2.5,hjust=-.01, vjust=-.01, angle = 35) +
geom_point(aes(y=XYZmin), show_guide=FALSE) +
geom_hline(y=0,size=1,color='purple') +
theme(axis.text.y = element_blank()) + ylab('') + xlab('') +
labs(title = "Timeline for when what happened")
plot.alt
Run Code Online (Sandbox Code Playgroud)

或者,这是一种使用geom_segment以下方法构建它的方法:
plot <- ggplot(df,aes(x=date)) +
#Three geom_segments
geom_segment(aes(y=0,yend=Xminp,xend=date), colour= "blue") +
geom_segment(aes(y=Xminp,yend=Xminp + Yminp,xend=date), colour= "red") +
geom_segment(aes(y=Xminp + Yminp,yend=Xminp + Yminp + Zminp,xend=date), colour= "green") +
#This is all from your plot
geom_text(aes(y=XYZmin,label=paste(action, '\n this happed on ', date)),size=2.5,hjust=-.01, vjust=-.01, angle = 35) +
geom_point(aes(y=XYZmin)) +
geom_hline(y=0,size=1,color='purple') +
theme(axis.text.y = element_blank()) + ylab('') + xlab('') +
labs(title = "Timeline for when what happened")
plot
Run Code Online (Sandbox Code Playgroud)
希望这是有道理的...让我知道,如果它不是你想要的.
