我是R和ggplot2的新手,我想知道如何使用R在给定时间生成时间线绘制点?我的日期也有些麻烦。 (我不确定我是否应该将此作为两个问题发布,但这里也是如此)。
我有一个数据框,其中年份和月份为YYYYMM格式的字符,两个人的姓名以及发生的事件。
像这样:
> data
YearMonth Person1 Person2 Event
200606 Alice Bob event1
200606 Bob Alice event2
200608 Alice Bob event3
200701 Alice Bob event3
200703 Bob Alice event2
200605 Alice Bob event4
日期最初是整数,我使用as.character()
将其转换为字符。我想将其转换为格式化日期。
我使用as.Date()
并尝试了不同的格式化日期。我最接近的是data$YearMonth <- as.Date(data$YearMonth,"%Y")
,但这分别让所有2006xx和2007xx行的'2006-12-20'和'2007-12-20'。有没有办法做到这一点,以便我得到像'YYYY-MM'或'YYYY / MM'这样的东西?
我也尝试了data$YearMonth <- strptime(data$YarMonth, "%Y%m")
,但这给了我<NA>
个值。
但我的主要问题是时间表。
以下图片是我想要的格式:
但x轴显示月份和年份(如2006-06,2006-07 ... 2007-06),以及标有Event,Person1和Person2的轴线。
我查看了?timeline
处的'timeline'包,但我的数据框没有时间段(开始和结束日期)的数据。我只是有一个时间点(YearMonth)。
我还使用ggplot2尝试了Draw a chronological timeline with ggplot2的示例。但是我没有y轴的位错,我希望事件线离开x轴。
注意:这是一个非常简化的示例,因为我在2006年6月到2007年6月期间有大约一千行。是否可以使用这么多数据制作时间轴?
非常感谢任何帮助。谢谢你的时间!
答案 0 :(得分:8)
这是另一次尝试:
df$YM <- as.Date(paste0("01",df$YearMonth), format="%d%Y%m")
rangeYM <- range(df$YM)
plot(NA,ylim=c(-1,1),xlim=rangeYM,ann=FALSE,axes=FALSE)
abline(h=0,lwd=2,col="#5B7FA3")
ypts <- rep_len(c(-1,1), length.out=nrow(df))
txtpts <- rep_len(c(1,3), length.out=nrow(df))
segments(df$YM,0,df$YM,ypts,col="gray80")
axis.Date(
1,
at=seq.Date(rangeYM[1],rangeYM[2],by="month"),
format="%Y-%m",
cex.axis=0.6,
pos=0,
lwd=0,
lwd.tick=2,
col="#5B7FA3",
font=2
)
points(df$YM,y=ypts, pch="-", cex=1.5, col="#5B7FA3")
par(xpd=NA)
text(
df$YM, y=ypts,
labels=paste(df$Person1,df$Person2,df$Event,sep="\n"), cex=0.7, pos=txtpts
)
par(xpd=FALSE)
答案 1 :(得分:2)
为什么不这样:
>YearMonth = c(200506,200509)
>dt = as.POSIXct(strptime(paste0(YearMonth, 15), "%Y%m%d"))
>z = rep(0, length(dt))
>y = rep(c(-1,1), out=length(dt))
>plot(dt,y, axes=FALSE, ylab="", xlim=c(min(dt)-10e6, max(dt)+10e6), ylim=c(-2,2), pch=15, col="darkblue", xlab="Date")
>arrows(x0=dt,y0= z, x1=dt, y1=y, length=0, angle=30, col="blue")
>arrows(min(dt), 0, max(dt), length=0, col="blue")
>text(dt, y*1.5, c("Ben Franklin arose\nfrom the dead", "Atlantis found"), adj=1)
>axis.POSIXct(1, dt, format="%y/%m")
>dt
[1] "2005-06-15 EDT" "2005-09-15 EDT"
答案 2 :(得分:0)
对@thelatemail的回答稍作修改,您可以微调轴以打印事件日期的指示符,并管理在同一日期发生的事件的重叠。或管理由于您拥有的数据量而产生的重叠在你的df ..
df$YM <- as.Date(paste0("01",df$YearMonth), format="%d%Y%m")
rangeYM <- range(df$YM)
plot(NA,ylim=c(-1,1),xlim=rangeYM,ann=FALSE,axes=FALSE)
abline(h=0,lwd=2,col="#5B7FA3")
ypts <- rep(c(-1,-0.5,0.5,1), length.out=nrow(df))
txtpts <- rep(c(1,3), length.out=nrow(df))
segments(df$YM,0,df$YM,ypts,col="gray80")
axis.Date( 1,at=seq.Date(rangeYM[1],rangeYM[2],by="days"),
format="%Y-%m",
cex.axis=0.6, pos=0, lwd=0, lwd.tick=2, col="#5B7FA3", font=2)
points(df$YM,y=ypts, pch="-", cex=1.5, col="#5B7FA3")
par(xpd=NA)
text( df$YM, y=ypts,labels=paste(df$Person1,df$Person2,df$Event,sep="\n"),cex=0.7, pos=txtpts)
par(xpd=FALSE)