2011-07-10 15 views
9

Estoy graficando value ~ date en ggplot2 (en R). tengo el siguiente código. Como ve, ggplot2 agrega más interrupciones en el eje x que tengo en mis datos. Solo quiero tener la etiqueta x cada vez que tengo un punto de datos en mi marco de datos. ¿Cómo puedo forzar a ggplot2 a que solo muestre las interrupciones solo en los valores de my.dates? Parece que no hay ningún argumento "rompe" para scale_x_dateDescansos para scale_x_date en ggplot2 y R

require(ggplot2) 
my.dates = as.Date(c("2011-07-22","2011-07-23", 
        "2011-07-24","2011-07-28","2011-07-29")) 
my.vals = c(5,6,8,7,3) 
my.data <- data.frame(date =my.dates, vals = my.vals) 
plot(my.dates, my.vals) 
p <- ggplot(data = my.data, aes(date,vals))+ geom_line(size = 1.5) 
p <- p + scale_x_date(format="%m/%d", ' ') 
p 

enter image description here

Respuesta

14

Un enfoque sería para tratar el eje x como numéricos y establecer los descansos y las etiquetas con la estética scale_x_continuous().

ggplot(my.data, aes(as.numeric(date), vals)) + 
    geom_line(size = 1.5) + 
    scale_x_continuous(breaks = as.numeric(my.data$date) 
        , labels = format(my.data$date, format = "%m/%d")) 

aunque el intervalo entre el 7/24 y el 7/28 parece un poco extraño en mi opinión. Sin embargo, creo que eso es lo que quieres? Avísame si he malinterpretado.

EDITAR

Como se señaló anteriormente, no estaba encantado con la forma en los descansos se veía anteriormente, específicamente con la rejilla gris en el fondo. Esta es una forma de mantener la cuadrícula rectangular y etiquetar solo los puntos donde tenemos datos. Podrías hacer todo esto dentro de la llamada a ggplot, pero creo que es más fácil hacer el procesamiento fuera de ggplot. Primero, crea un vector que contenga la secuencia de números correspondiente a las fechas. A continuación, vamos a actualizar las etiquetas apropiadas y sustituyen a las entradas de NA con " " para evitar cualquier cosa, desde que se representa en el eje X para aquellas entradas:

xscale <- data.frame(breaks = seq(min(as.numeric(my.data$date)), max(as.numeric(my.data$date))) 
         , labels = NA) 

xscale$labels[xscale$breaks %in% as.numeric(my.data$date)] <- format(my.data$date, format = "%m/%d") 
xscale$labels[is.na(xscale$labels)] <- " " 

Esto nos da algo que se parece a:

breaks labels 
1 15177 07/22 
2 15178 07/23 
3 15179 07/24 
4 15180  
5 15181  
6 15182  
7 15183 07/28 
8 15184 07/29 

que luego se puede pasar a la escala de la siguiente manera:

scale_x_continuous(breaks = xscale$breaks, labels = xscale$labels)

+0

muchas gracias. la primera parte resolvió mi problema. ¿Sabes por casualidad cómo puedo mantener los saltos del eje x pero eliminar sus líneas de cuadrícula? – Mark

+2

@Mark - 'opts (panel.grid.major = theme_blank(), panel.grid.minor = theme_blank())' debería hacer el truco. – Chase

+1

Lanza el 'Error: valor discreto proporcionado a escala continua' en' ggplot2 1.0.0'. – MYaseen208

Cuestiones relacionadas