2013-12-20 187 views
5

我是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>值。

但我的主要问题是时间表。

下面的图片是那种格式的我想:

http://www.vertex42.com/ExcelArticles/Images/timeline/Timeline-for-Benjamin-Franklin.gif

,但与x轴显示的月份和年份(如2006-06,2006-07 ... 2007-06),和来自标有Event,Person1和Person2的轴线。

我已经看过'时间线'包?timeline,但我所拥有的数据框没有关于时间段(开始和结束日期)的数据。我只是有一个时间点(YearMonth)。

我也试过使用ggplot2在Draw a chronological timeline with ggplot2的例子。然而,我没有y轴的位错,我想让事件行离开x轴。

注:这是一个非常简单的例子,因为我在2006年6月至2007年6月的时间段内有大约1000行。是否有可能用这么多数据创建时间表?

任何帮助,非常感谢。谢谢你的时间!

回答

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) 

enter image description here

+0

非常感谢@thelatemail。除了我所拥有的数据量有一些问题,它完美的工作! :) –

+0

@thelatemail in'axis.Date''pos'将日期值定位在水平线上。有没有任何选项可以在ggplot2中做到这一点? 'scale_x_date'中没有位置选项。请帮助 – mockash

+0

这太棒了,谢谢发布这个 –

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" 

enter image description here

+0

感谢您的回复。这也给我一天,而不仅仅是年和月。我想我可以使用它,但我想知道在制作时间表时是否会导致问题。我想看看是否可以使用我的数据框中的日期作为轴的日期。 –

+0

@ o.o - 亚历克斯所做的一切都是为每个月/每年选择一个中间点。任何一个月/年组合的情节都会有一个与之相关的名义日,无论是第一个,最后一个,中间还是其他日子。 – thelatemail

+0

我改变了轴上的日期 - 他们确实看起来像他们包括一天。 “日”添加只是让POSIXct日期功能起作用的一个技巧,这使得绘图更容易。您*应该*能够将我的日期功能直接应用于数据框以使日期有效。 –

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)