2012-04-28 8 views
17

Tengo un problema con geom_bars en el que las barras no se representan cuando especifico límites en el eje y. Creo que el siguiente debe reproducir el problema:barras geom_bar que no se muestran al especificar ylim

data <- structure(list(RoleCond = structure(c(1L, 1L, 2L, 2L), .Label = c("Buyer", "Seller"), class = "factor"), 
        ArgCond = structure(c(1L, 2L, 1L, 2L), .Label = c("No Argument", "Argument"), class = "factor"), 
        mean = c(2210.71428571429, 2142.70833333333, 2282.40740740741, 2346.2962962963), 
        se = c(20.1231042081511, 16.7408757749718, 20.1471554637891, 15.708092540868)), 
        .Names = c("RoleCond", "ArgCond", "mean", "se"), row.names = c(NA, -4L), class = "data.frame") 

library(ggplot2)  
ggplot(data=data, aes(fill=RoleCond, y=mean, x=ArgCond)) + 
     geom_bar(position="dodge", stat="identity") + 
     geom_errorbar(limits, position=dodge, width=0.1, size=.75) + 
     scale_y_continuous(limits=c(2000,2500)) 

que me da este

no bars

El mismo código sin los límites especificados funciona bien. El geom_errorbar() no parece estar relacionado con el problema, pero sí ilustra dónde deberían aparecer las barras.

He intentado usar coord_cartesian(ylim=c(2000,2500)) que funciona para limitar el yaxis y hacer que aparezcan las barras, pero las etiquetas de los ejes se estropean y no entiendo qué estoy haciendo con ellas.

¡Gracias por cualquier sugerencia! (Estoy usando R 2.15.0 y 0.9.0 ggplot2)

Respuesta

27

Usted podría intentar, con library(scales):

+ scale_y_continuous(limits=c(2000,2500),oob = rescale_none) 

lugar, como se indica here.

+2

Ver también la respuesta de Hadley: "Creo que usar squish sería canónico. Y este es un uso válido, pero crea un gráfico engañoso". (Para ampliar el segundo punto: generalmente * no * se considera una buena idea usar barras cuando la línea base del gráfico no está en cero ... –

+3

Gracias Joran y Ben. Nota para cualquiera que encuentre esto, tuve que cargar 'biblioteca (escala) 'para usar el parámetro oob. Definitivamente comparto las preocupaciones con líneas de base distintas de 0 en gráficos de barras en general, pero en este caso el único rango posible de respuestas fue 2000-2500, así que creo que ilustra las diferencias de manera justa (también, es lo que la gente espera y no me siento lo suficientemente valiente como para "hacer lo correcto" en este momento) –

+3

@SamSwift, creo que es 'library (scales)' (con una "s"). – A5C1D2H2I1M1N2O1R2T1

8

Adición de una respuesta para mi caso que es ligeramente diferente en caso de que alguien se encuentra con esto:

Al utilizar position="dodge", los bares están horizontalmente redimensionan automáticamente para llenar el espacio que es a menudo mucho más allá de los límites de los datos en sí. Como resultado, incluso si sus límites x-axis y y-axis son limits=c(min-1, max+1, para ciertos conjuntos de datos, el position="dodge" podría redimensionarlo más allá de ese límite, haciendo que las barras no aparezcan. Esto podría incluso ocurrir si su piso límite es 0, a diferencia del caso anterior.

Usando oob=rescale_none en ambos scale_y_continous() Y scale_x_continuous() corrige este problema simplemente cortando el redimensionamiento realizado por position="dodge".

Como por comentario anterior, requiere package:scales así que ejecute library(scales) primero.

Espero que esto ayude a alguien más en el que las respuestas anteriores solo te ayuden en parte.

1

Esto funcionó para mí basado en el enlace compartido previamente.

p + coord_cartesian(ylim=c(5,15)) 
Cuestiones relacionadas