2011-03-02 28 views
8

Digamos que tenemos el siguiente marco de datos simple de pares de fecha y valor, donde faltan algunas fechas en la secuencia (es decir, del 12 al 14 de enero). Cuando trazo los puntos, muestra estas fechas faltantes en el eje x, pero no hay puntos correspondientes a esas fechas. Quiero evitar que estas fechas faltantes aparezcan en el eje x, de modo que la secuencia de puntos no tenga interrupciones. ¿Alguna sugerencia sobre cómo hacer esto? ¡Gracias!R + ggplot2: cómo ocultar las fechas faltantes del eje x?

dts <- c(as.Date(c('2011-01-10', '2011-01-11', '2011-01-15', '2011-01-16'))) 
df <- data.frame(dt = dts, val = seq_along(dts)) 
ggplot(df, aes(dt,val)) + geom_point() + 
     scale_x_date(format = '%d%b', major='days') 

enter image description here

Respuesta

8

Girar los datos de fecha en un factor de entonces. Por el momento, ggplot está interpretando los datos en el sentido en que usted le dijo que están en los datos: una escala de fecha continua. Usted no quiere que la escala, que desea una escala categórica:

require(ggplot2) 
dts <- as.Date(c('2011-01-10', '2011-01-11', '2011-01-15', '2011-01-16')) 
df <- data.frame(dt = dts, val = seq_along(dts)) 
ggplot(df, aes(dt,val)) + geom_point() + 
     scale_x_date(format = '%d%b', major='days') 

frente

df <- data.frame(dt = factor(format(dts, format = '%d%b')), 
        val = seq_along(dts)) 
ggplot(df, aes(dt,val)) + geom_point() 

que produce: enter image description here

¿Es eso lo que querías?

+0

@Gavin, gracias ... pero que cambia es la fecha mostrado: tuve 10Jan hasta 16Jan, ahora tenemos 2Jan hasta 5Jan. ¿Alguna manera de arreglar eso? Creo que podría tratar las fechas como cadenas y perder por completo la semántica de las fechas, pero ¿hay alguna forma de no perder la semántica de las fechas? –

+0

Pero esas son fechas consecutivas, y no las de la pregunta original. –

+0

Me di cuenta de que olvidé formatear las fechas según la escala original. Mi culpa: ver la respuesta ahora. –

5

La primera pregunta es: ¿por qué quieres hacer eso? No tiene sentido mostrar un gráfico basado en coordenadas si sus ejes no son coordenadas. Si realmente quieres hacer esto, puedes convertirlo en un factor. Tenga cuidado para el fin de que:

dts <- c(as.Date(c('31-10-2011', '01-11-2011', '02-11-2011', 
      '05-11-2011'),format="%d-%m-%Y")) 
dtsf <- format(dts, format= '%d%b') 
df <- data.frame(dt=ordered(dtsf,levels=dtsf),val=seq_along(dts)) 
ggplot(df, aes(dt,val)) + geom_point() 

enter image description here

Con factores que hay que tener cuidado, ya que el orden es arbitrario en un factor, a menos que sea un factor ordenada. Como los factores están ordenados alfabéticamente por defecto, puede tener problemas con algunos formatos de fecha. Así que ten cuidado con lo que haces. Si usted no toma el orden en cuenta, que se obtiene:

df <- data.frame(dt=factor(dtsf),val=seq_along(dts)) 
ggplot(df, aes(dt,val)) + geom_point() 

enter image description here

+0

Es bastante común en las series de tiempo financieras no tener datos los fines de semana, por lo que no es agradable visualmente tener descansos en parcelas donde hay fines de semana. –

+0

@Prasad: Ya veo. Prefiero agregar algo así como "días hábiles" y luego en el eje X, ya que ahora da la impresión de una función continua que, de hecho, no es continua en el eje X. Suena como quisquilloso, pero puede ser bastante confuso. –

+0

+1 puntos buenos en los factores de pedido –

7

Hice un paqueteque hace esto. Se llama bdscale y está en CRAN y github. Enchufe desvergonzado

pueda replicar su ejemplo:

> library(bdscale) 
> library(ggplot2) 
> library(scales) 
> dts <- as.Date(c('2011-01-10', '2011-01-11', '2011-01-15', '2011-01-16')) 
> ggplot(df, aes(x=dt, y=val)) + geom_point() + 
    scale_x_bd(business.dates=dts, labels=date_format('%d%b')) 

replicate example

Pero lo que es probable que desee es cargar fechas válidas conocidas, a continuación, trazar sus datos usando las fechas válidas en el eje x:

> nyse <- bdscale::yahoo('SPY') # get valid dates from SPY prices 
> dts <- as.Date('2011-01-10') + 1:10 
> df <- data.frame(dt=dts, val=seq_along(dts)) 
> ggplot(df, aes(x=dt, y=val)) + geom_point() + 
    scale_x_bd(business.dates=nyse, labels=date_format('%d%b'), max.major.breaks=10) 

Warning message: 
Removed 3 rows containing missing values (geom_point). 

better

El advertencia le está diciendo que lo retiren tres fechas:

  • 15a = Sábado
  • 16a = Domingo
  • 17a = MLK Día
+1

Solo una pequeña corrección, usted creó un * paquete * que hace esto (no biblioteca) –

+1

Tengo un _paquete_ para usted ** aquí mismo, amigo. Aww yiss. Pero está en lo correcto señor, lo corregiré. – dvmlls

Cuestiones relacionadas