2010-04-21 17 views
11

Este es un seguimiento de this question, in which I was trying to suppress the vertical gridlines.¿Cómo puedo suprimir las líneas verticales de la cuadrícula en un diagrama ggplot2 mientras retiene las etiquetas del eje x?

La solución, proporcionada por learnr, era agregar scale_x_continuous (breaks = NA), pero esto tenía el efecto secundario de suprimir también las etiquetas del eje x. Estoy totalmente feliz de volver a escribir las etiquetas a mano, pero no me queda claro cómo saber a dónde deben ir las etiquetas.

La otra opción es suprimir todas las líneas de la cuadrícula (utilizando opts (panel.grid.major = theme_blank()) o algo así) y luego dibujando de nuevo solo en las principales líneas de cuadrícula horizontales. Una vez más, el problema aquí es cómo averiguar qué interrupciones hay en la trama para suministrar a geom_hline().

Así que, esencialmente, mis opciones son:.

  1. reprimir las líneas de división verticales y etiquetas del eje X (utilizando scale_x_continuous (roturas = NA)) y añadir las etiquetas del eje x de vuelta en
  2. suprimir todas las gridlines (usando opts (panel.grid.major = theme_blank())) y agrega las principales líneas de cuadrícula horizontales usando geom_hline().

Estas son las dos opciones:

library(ggplot2) 

data <- data.frame(x = 1:10, y = c(3,5,2,5,6,2,7,6,5,4)) 

# suppressing vertical gridlines and x-axis labels 
# need to re-draw x-axis labels 
ggplot(data, aes(x, y)) + 
    geom_bar(stat = 'identity') + 
    scale_x_continuous(breaks = NA) + 
    opts(
    panel.grid.major = theme_line(size = 0.5, colour = '#1391FF'), 
    panel.grid.minor = theme_blank(), 
    panel.background = theme_blank(), 
    axis.ticks = theme_blank() 
) 

# suppressing all gridlines 
# need to re-draw horizontal gridlines, probably with geom_hbar() 
ggplot(data, aes(x, y)) + 
    geom_bar(stat = 'identity') + 
    scale_x_continuous(breaks = NA) + 
    opts(
    panel.grid.major = theme_blank(), 
    panel.grid.minor = theme_blank(), 
    panel.background = theme_blank(), 
    axis.ticks = theme_blank() 
) 
+0

Puede usar geom_text() para volver a agregar manualmente las etiquetas de tilde del eje x. – learnr

Respuesta

5

Como código en los comentarios no muestra muy bien, así que estoy publicando esto como una respuesta. Se podría hacer algo como esto y añadir etiquetas manualmente con geom_text():

ggplot(data, aes(x, y)) + 
     geom_bar(stat = 'identity') + 
     scale_x_continuous(breaks = NA) + 
     opts(
       panel.grid.major = theme_line(size = 0.5, colour = '#1391FF'), 
       panel.grid.minor = theme_blank(), 
       panel.background = theme_blank(), 
       axis.ticks = theme_blank() 
     )+ 
     geom_text(aes(label = x, y = -.3)) 
+0

Oh, duh - Estaba confundido porque, para volver a dibujar las líneas de cuadrícula horizontales, necesitaba saber dónde estaban las roturas/marcas, pero ya sé la posición x de las barras, así que esto no es un problema. ¡Muchas gracias por su ayuda, LearnR! – Tarek

+2

Otra nota más rápida aquí: esta respuesta resuelve mi pregunta tal como se establece, pero definitivamente no es la solución ideal, ya que estamos dibujando las etiquetas x en el área de la gráfica, no en el margen.Esto tiene efectos en cadena para el rango y los cortes y, por lo tanto, sería preferible una solución que esté desacoplada del área de datos. Hadley, no sé si estás leyendo esto, pero una forma de desconectar las líneas de cuadrícula horizontales o verticales sería increíble ... – Tarek

1

Para ello, puede editar el grob directamente, intenta:

grid.remove(gPath("panel.grid.minor.x.polyline"),grep=T) 
grid.remove(gPath("panel.grid.major.x.polyline"),grep=T) 

Será despojarse de sus líneas verticales. Solo tengo problemas para usarlo dentro de una función, porque supongo que solo funciona cuando se imprime el ggplot.

Pero, si ese no es tu caso y solo necesitarás el gráfico, entonces funcionará.

2

Las respuestas anterior no funcionará en la versión 0.9.2.1 y ggplot2 anteriormente. Afortunadamente, ahora hay una manera más fácil de hacerlo, como se describe en respuesta a una pregunta diferente: https://stackoverflow.com/a/8992102/800044.

Cuestiones relacionadas