2017-10-17 2 views
-2

Ich weiß, dass mit scale_x_date(date_labels="%b"...) erstellt Tick-Etiketten mit den ersten drei Buchstaben in jedem Monat. Gibt es eine Möglichkeit, den ersten Buchstaben eines jeden Monats einfach einzufügen? Anstatt "Jan Feb March..." wären die Labels "J F M...".Erstellen ggplot2 x-Achse Monat Etiketten mit nur ersten Buchstaben jedes Monats

Hier ist ein Beispiel: Die Monatsetiketten überschneiden sich, also hoffte ich, die Etiketten auf nur den ersten Buchstaben ändern zu können.

library(lubridate) 
library(ggplot2) 


set.seed(2) 
df = data.frame(Date=seq(as.Date("2010-01-01"),as.Date("2015-12-31p 
                "), by="1 day")) 
df$value = cumsum(rnorm(nrow(df))) 


p = ggplot(df, aes(Date, value)) + 
    geom_vline(xintercept=as.numeric(df$Date[yday(df$Date)==1]), colour="grey60") + 
    geom_line() + 
    scale_x_continuous(labels = year_labels <- rep(c('J','F','M','A','M','J','J','A','S','O','N','D'),5)) + 
    theme_bw() + 
    theme(panel.grid.minor.x = element_blank()) + 
    labs(x="") 
p 

enter image description here

Ich habe versucht, die Linie scale_x_date(date_labels="%b", date_breaks="month", expand=c(0,0))-scale_x_continuous(labels = year_labels <- rep(c('J','F','M','A','M','J','J','A','S','O','N','D'),5))

aber die

unten Fehler erzeugt ändern

Fehler bei as.Date.numeric (Wert): ‚Herkunft 'muss geliefert werden

+0

können Sie bitte ein reproduzierbares Beispiel liefern –

+0

Ihr Beispiel ist nicht reproduzierbar –

+0

Ich überspringe einfach die Zeile 'geom_vline (xintercept = as.numeric (df $ Datum [yday (df $ Date) == 1]), color =" grey60 ")' was ich nur als Teil der * Dekoration * betrachte und es hat gut funktioniert – Marco

Antwort

1

Ich habe einen Weg gefunden, es zu tun. Kennt jemand eine einfachere Möglichkeit, die gleiche Ausgabe zu produzieren?

set.seed(2) 
df = data.frame(Date=seq(as.Date("2010-01-01"),as.Date("2015-12-31"), by="1 day")) 
df$value = cumsum(rnorm(nrow(df))) 

year_labels <- rep(c('J','F','M','A','M','J','J','A','S','O','N','D')p,6) 


# The plot we'll start with 
p = ggplot(df, aes(Date, value)) + 
    geom_vline(xintercept=as.numeric(df$Date[yday(df$Date)==1]), colour="grey60") + 
    geom_line() + 
    # scale_x_continuous(labels = year_labels) + 
    scale_x_date("Date",breaks = c(seq(from=as.Date("2010-01-01"),to=as.Date("2015-12-31"),by="month")), 
       labels = year_labels) 
p 

enter image description here

1

Ich glaube, die schönste Art pretty_breaks aus dem Paket scales zu verwenden ist. Es produziert nicht die von Ihnen gewünschte Ausgabe, aber ich denke, es ist schöner und funktioniert reibungslos für jede Datenlänge.

library(ggplot2) 
library(scales) 

set.seed(2) 
df = data.frame(Date=seq(as.Date("2010-01-01"),as.Date("2014-12-31p 
               "), by="1 day")) 
df$value = cumsum(rnorm(nrow(df))) 

p = ggplot(df) + 
    geom_line(aes(Date, value), size=0.1) + 
    scale_y_continuous(name= "Title of y [units]")+ 
    scale_x_date(breaks=pretty_breaks(), date_minor_breaks="1 month") + 
    theme_bw() 
p 

enter image description here

enter image description here

Hier änderte ich die date_minor_breaks="6 months" den Überschuss an Monate enter image description here

Schön und einfach zu vermeiden !!

+0

Danke Marco. Das ist für meine aktuelle Aufgabe nicht sehr nützlich, aber in Zukunft werde ich auf deinen Beitrag zurückkommen. Ihre Pläne sehen gut aus und ich muss in das Waagenpaket schauen. –

Verwandte Themen