2012-01-21 24 views
14

Estoy intentando trazar el cambio en una serie temporal para cada año calendario usando ggplot y estoy teniendo problemas con el control fino del eje x. Si yo no uso scale="free_x" luego termino con un eje x que muestra varios años, así como el año en cuestión, así:R ggplot y rejilla de facetas: cómo controlar las rupturas del eje x

Facet grid plot with common x-axis

Si hago uso de scale="free_x" entonces como uno esperaría que terminan con etiquetas señalizadoras para cada trama, y ​​que en algunos casos puede variar por trama, que no quiero:

Facet grid plot with free x-axis

he hecho varios intentos para definir el eje x usando etc scale_x_date pero sin ningún éxito. Mi pregunta es por lo tanto:

P. ¿Cómo puedo controlar las roturas del eje x y las etiquetas en una cuadrícula de facetas ggplot para que el eje x (serie de tiempo) sea idéntico para cada faceta, se muestre solo en la parte inferior del y está en forma de meses formateados 1, 2, 3 etc. o como 'Jan', 'Feb', 'Mar'?

Código sigue:

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) 

Respuesta

10

aquí es un ejemplo:

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

¿Quieres este?

El truco es generar día del año de un mismo año ficticio.

ACTUALIZADA

aquí es un ejemplo para la versión dev (es decir, 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. Simple y lógico cuando lo piensas y funciona muy bien con mis datos. ¿También podría preguntar si hay alguna (forma sencilla de hacer que los descansos y las etiquetas vayan de enero a diciembre en lugar de pasar de enero a enero como en la captura de pantalla anterior?) Puedo vivir con Jan y Jan, solo me pregunto si hay una solución alternativa. Gracias Dan – SlowLearner

+0

Arigatou gozaimasu. Probablemente no sea fácil en la versión actual. – kohske

+0

Entendido, lo aceptaré como es con aprecio – SlowLearner

Cuestiones relacionadas