2017-07-06 1 views
3

Ich suche nach einer Möglichkeit, die Datumsbezeichnungen auf einem ggplot zu einem (scheinbar) logischen Zeitpunkt zu erzwingen. Ich hatte das Problem einige Male, aber mein derzeitiges Problem ist, dass ich möchte, dass die Unterbrechungen auf der 01/01/yyyy Meine Daten sind ein großer Datensatz mit POSIXct Date Spalte, Daten in Flow-Spalte und eine Reihe von Site-Namen in der StandortspalteErzwingen Sie, dass ggplot-Skalen mit z. 1. des Jahres, 1. des Monats usw.

library(ggplot2) 
library(scales) 
ggplot(AllFlowData, aes(x=Date, y = Flow, colour = Site))+geom_line()+ 
scale_x_datetime(date_breaks = "1 year", expand =c(0,0),labels=date_format("%Y")) 

kann ich die Pausen zwingen, jedes Jahr zu sein und sie scheinen in Ordnung, ohne die labels=date_format("%Y") (ab 01/01 pro Jahr), aber wenn ich labels=date_format("%Y") enthalten (wie es 10 Jahre Daten bekommt so ein bisschen chaotisch) Die Datumsbezeichnungen bewegen sich zu ~ November, und 1989 ist das erste Etikett, obwohl meine Daten am 01/01/1990 beginnen.

Ich habe dieses Problem in der Vergangenheit schon mehrmals in verschiedenen Zeitschritten gehabt, zB wollte ich es auf den 1. des Monats oder die Tageszeiten zwingen, um Mitternacht anstatt tagsüber zu sein. Gibt es einen generischen Weg, dies zu tun?

Ich habe mir create specific date range in ggplot2 (scale_x_date) angesehen, aber ich möchte meine Pausen nicht hart codieren müssen, da ich ein paar Plots mit verschiedenen Datumsbereichen zu tun habe.

Dank

+0

Sie können die Pausen explizit festlegen, ohne sie hart zu codieren, indem Sie den Datumsbereich direkt aus den Daten abrufen. Zum Beispiel 'library (lubridate); breaks = mit (AllFlowData, seq (as.POSIXct (paste0 (Jahr (min (Datum)), "- 01-01")), max (Datum)), by = "Jahr") '. Oder erstellen Sie einfach einen Datumssequenzvektor für "Breaks", der den gesamten Bereich aller Ihrer Datenrahmen umfasst und denselben Vektor für alle Plots verwendet. Es wirkt sich nicht auf die Achsengrenzen aus und gewährleistet, dass jede Parzelle am 1. Januar (oder wann immer) jedes Jahres Pausen hat. – eipi10

Antwort

2

Wenn die Daten in einem Vektor wie zu Ihnen kommen:

dates <- seq.Date(as.Date("2001-03-04"), as.Date("2001-11-04"), by="day") 
## "2001-03-04" "2001-03-05" "2001-03-06" ... "2001-11-03" "2001-11-04" 

Verwendung pretty.Dates() eine beste Vermutung über die Endpunkte zu machen.

range(pretty(dates)) 
## "2001-01-01" "2002-01-01" 

Dann übergeben Sie diesen Bereich an ggplot.

Ich empfehle jedoch coord_cartesian() anstelle von scale_x_date(). Normalerweise möchte ich die Grafikgrenzen zuschneiden, anstatt die Werte vollständig auszublenden (was Dinge wie eine Lösszusammenfassung verfälschen kann).

Verwandte Themen