2013-12-20 15 views
5

Ich bin neu in R und ggplot2 und ich frage mich, wie kann ich eine Zeitlinie Plotten von Punkten zu einem bestimmten Zeitpunkt mit R? Ich habe auch Probleme mit den Daten, die ich habe. (Ich bin mir nicht sicher, ob ich das als zwei Fragen posten sollte, aber hier geht es).Chronologische Zeitleiste mit Zeitpunkten und Format Datum

Ich habe einen Datenrahmen mit dem Jahr und Monat als Zeichen im Format YYYYMM, Namen von zwei Personen und das Ereignis, das stattgefunden hat.

So:

> 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 

Die Termine waren ursprünglich ganze Zahlen, die ich Zeichen as.character() mit konvertiert. Ich versuche, es in ein formatiertes Datum zu konvertieren. Ich verwendete as.Date() und versuchte verschiedene Möglichkeiten, das Datum zu formatieren. Am nächsten kam ich mit data$YearMonth <- as.Date(data$YearMonth,"%Y"), aber das brachte mir '2006-12-20' und '2007-12-20' für alle Zeilen 2006xx und 2007xx. Gibt es eine Möglichkeit, dies zu tun, so dass ich etwas wie "JJJJ-MM" oder "JJJJ/MM" bekomme?

Ich versuchte auch data$YearMonth <- strptime(data$YarMonth, "%Y%m"), aber das gab mir <NA> Werte.

Aber mein Hauptproblem ist die Timeline.

Das folgende Bild ist die Art von Format Ich mag:

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

aber mit der x-Achse (wie 2006-06, 2006-07 ... 2007-06), den Monat und das Jahr zeigt, und die Linien, die von der Achse kommen, die mit dem Ereignis, Person1 und Person2 gekennzeichnet sind.

Ich habe das Paket 'Timeline' unter ?timeline angeschaut, aber der Datenrahmen, den ich habe, hat keine Daten für die Zeiträume (Start- und Enddatum). Ich habe gerade einen Zeitpunkt (YearMonth).

Ich habe auch das Beispiel unter Draw a chronological timeline with ggplot2 mit ggplot2 versucht. Allerdings habe ich die Versetzungen für eine y-Achse nicht und wollte, dass die Ereignislinien von der x-Achse kommen.

Hinweis: Dies ist ein sehr vereinfachtes Beispiel, da ich ungefähr tausend Zeilen für den Zeitraum Juni 2006 bis Juni 2007 habe. Ist es sogar möglich, die Zeitachse mit so vielen Daten zu erstellen?

Jede Hilfe wird sehr geschätzt. Vielen Dank für Ihre Zeit!

Antwort

8

Hier ist ein weiterer Versuch:

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

Vielen Dank @thelatemail. Abgesehen von ein paar Problemen mit der Menge an Daten, die ich hatte, hat es perfekt funktioniert! :) –

+0

@thelatemail in 'axis.Date' Die' pos' positioniert die Datumswerte auf der horizontalen Linie. Gibt es eine Möglichkeit, dies in ggplot2 zu tun? Es gibt keine Option für die Position in 'scale_x_date'. bitte helfe – mockash

+0

Das ist so toll, danke für das Posten dieses –

2

Warum das nicht:


>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

Vielen Dank für Ihre Antwort. Das gibt mir auch einen Tag, nicht nur Jahr und Monat.Ich denke, ich könnte das einfach verwenden, aber ich frage mich, ob es Probleme beim Erstellen der Timeline geben könnte. Ich wollte sehen, ob ich die Daten aus meinem Datenrahmen als Daten für die Achse verwenden könnte. –

+0

@ o.o - alles, was Alex getan hat, ist einen mittleren Punkt für jeden Monat/Jahr zu wählen. Jede Handlung einer Monat/Jahr-Kombination wird mit einem nominalen Tag assoziiert, egal ob es sich um den ersten, letzten, mittleren oder anderen Tag handelt. – thelatemail

+0

Ich änderte die Daten auf der Achse - sie sahen aus, als hätten sie einen Tag miteingeschlossen. Der Zusatz "day" ist nur ein Trick, um die POSIXct-Datumsfunktion zum Laufen zu bringen, was das Plotten erleichtert. Sie * sollten * in der Lage sein, meine Datumsfunktion direkt auf einen Datenrahmen anzuwenden, damit Ihre Daten funktionieren. –

0

Mit einigen geringfügigen Änderungen zu beantworten @thelatemail Sie die Achse finetune kann Druckindikator für Ereignisdaten und Verwalten Sie auch die Überlappung von Ereignissen, die am gleichen Datum auftreten .. oder verwalten Sie die Überschneidung aufgrund der Menge an Daten, die Sie in Ihrem 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)