2013-12-20 184 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)