2012-01-21 10 views
14

Sto provando a tracciare il cambiamento in una serie storica per ogni anno di calendario usando ggplot e sto avendo problemi con il controllo fine dell'asse x. Se io non uso scale="free_x" poi io alla fine con un asse x che mostra diversi anni, così come l'anno in questione, in questo modo:R ggplot e facet grid: come controllare le interruzioni sull'asse x

Facet grid plot with common x-axis

Se io uso scale="free_x" allora come ci si aspetterebbe I finisce con etichette delle tacche per ogni trama, e che in alcuni casi variano da trama, che io non voglio:

Facet grid plot with free x-axis

ho fatto vari tentativi di definire l'asse x utilizzando scale_x_date ecc, ma senza alcun successo. La mia domanda è quindi:

D. Come posso controllare le interruzioni e le etichette dell'asse x su una griglia di sfaccettatura ggplot in modo che l'asse x (serie storica) sia identico per ogni sfaccettatura, mostrato solo nella parte inferiore della pannello ed è sotto forma di mesi formattati 1, 2, 3 ecc. oppure come 'Jan', 'Feb', 'Mar'?

Codice segue:

require(lubridate) 
require(ggplot2) 
require(plyr) 

# generate data 
df <- data.frame(date=seq(as.Date("2009/1/1"), by="day", length.out=1115),price=runif(1115, min=100, max=200)) 
# remove weekend days 
df <- df[!(weekdays(as.Date(df$date)) %in% c('Saturday','Sunday')),] 
# add some columns for later 
df$year <- as.numeric(format(as.Date(df$date), format="%Y")) 
df$month <- as.numeric(format(as.Date(df$date), format="%m")) 
df$day <- as.numeric(format(as.Date(df$date), format="%d")) 

# calculate change in price since the start of the calendar year 
df <- ddply(df, .(year), transform, pctchg = ((price/price[1])-1)) 

p <- ggplot(df, aes(date, pctchg)) + 
    geom_line(aes(group = 1, colour = pctchg),size=0.75) + 
    facet_wrap(~ year, ncol = 2,scale="free_x") + 
    scale_y_continuous(formatter = "percent") + 
    opts(legend.position = "none") 

print(p) 

risposta

10

ecco un esempio:

df <- transform(df, doy = as.Date(paste(2000, month, day, sep="/"))) 

p <- ggplot(df, aes(doy, pctchg)) + 
geom_line(aes(group = 1, colour = pctchg),size=0.75) + 
facet_wrap(~ year, ncol = 2) + 
scale_x_date(format = "%b") + 
scale_y_continuous(formatter = "percent") + 
opts(legend.position = "none") 
p 

enter image description here

Vuoi questo?

Il trucco è generare giorno dell'anno di uno stesso anno fittizio.

AGGIORNAMENTO

qui è un esempio per la versione dev (cioè ggplot2 0,9)

p <- ggplot(df, aes(doy, pctchg)) + 
    geom_line(aes(group = 1, colour = pctchg), size=0.75) + 
    facet_wrap(~ year, ncol = 2) + 
    scale_x_date(label = date_format("%b"), breaks = seq(min(df$doy), max(df$doy), "month")) + 
    scale_y_continuous(label = percent_format()) + 
    opts(legend.position = "none") 
p 

enter image description here

+1

Sasu ga kohske. Semplice e logico quando ci pensi e funziona molto bene con i miei dati. Potrei anche chiedere se c'è (un modo semplice per fare in modo che le interruzioni e le etichette vadano da gennaio a dicembre anziché andare da gennaio a gennaio come nel tuo screenshot qui sopra? Posso vivere con Jan a Jan, mi chiedo solo se c'è un Grazie Dan – SlowLearner

+0

Arigatou gozaimasu, probabilmente non è facile nella versione attuale – kohske

+0

Capito, lo accetterò come è con apprezzamento – SlowLearner

Problemi correlati