2011-08-25 35 views
30

Quiero hacer un diagrama de barras donde uno de los valores es mucho más grande que todos los otros valores. ¿Hay alguna manera de tener un eje y discontinuo? Mi datos es el siguiente:Usando ggplot2, ¿puedo insertar un corte en el eje?

df <- data.frame(a = c(1,2,3,500), b = c('a1', 'a2','a3', 'a4')) 

p <- ggplot(data = df, aes(x = b, y = a)) + geom_bar() 
p <- p + opts(axis.text.x=theme_text(angle= 90, hjust=1)) + coord_flip() 
p 

enter image description here

¿Hay una manera que puedo hacer mi forma especificada a partir de 1- 10, luego 490 - 500? No puedo pensar en cualquier otra forma de representación gráfica de los datos (aparte de su transformación, lo que no quiero hacer)

+3

yo no creo que se pueda introducir pausas en ggplot2. una alternativa sería usar la escala 'log' que haría que el gráfico sea más fácil de leer. – Ramnath

+0

Me doy cuenta de que sería más fácil de leer en una escala de registro, pero no quiero mostrar la información de esta manera, ya que hay una variación significativa entre los valores pequeños que se ocultarían cuando se transforman. – djq

+3

¿qué pasa con una combinación de 'facet_wrap()' con 'scales =" free_x "' – Chase

Respuesta

30

Como se indicó en otra parte, esto no es algo que ggplot2 manejará bien, ya que los ejes rotos generalmente se consideran cuestionables.

Otras estrategias son a menudo considerados mejores soluciones a este problema. Brian mencionó algunas (facetas, dos tramas centradas en diferentes conjuntos de valores). Una otra opción que las personas pasan por alto con demasiada frecuencia, en especial para gráficos de barras, es hacer una tabla :

enter image description here

En cuanto a los valores reales, el 500 no oculta las diferencias en los otros valores! Por alguna razón, las tablas no reciben suficiente respeto como datos una técnica de visualización. Puede objetar que sus datos tienen muchas, muchas categorías que se vuelven difíciles de manejar en una tabla. Si es así, es probable que su gráfico de barras tenga demasiadas barras para ser sensato también.

Y no estoy argumentando para las tablas todos el tiempo. Pero definitivamente son algo a considerar si está haciendo gráficos de barras con relativamente pocos compases. Y si está haciendo diagramas de barras con toneladas de barras, puede que tenga que replantearse de todos modos.

Finalmente, también existe la función axis.break en el paquete plotrix que implementa los ejes rotos. Sin embargo, por lo que veo, tendrás que especificar las etiquetas de los ejes y las posiciones tú mismo, a mano.

+0

Joran, tengo sentimientos encontrados sobre el uso de este tipo de trama. Estás en lo correcto: una mesa es probablemente la mejor manera de mostrar esto. – djq

+0

@celenius - No quise sonar prosaica o como si te regañara. Siento que las mesas no reciben mucho amor, y a veces me molesta. ;) – joran

+0

¡No me sentí regañado! Simplemente no se me había ocurrido usar uno ... – djq

1

dudo que haya algo fuera de la plataforma en I, pero se puede mostrar los datos como una serie de cubos 3D parciales. 500 es solo 5 * 10 * 10, por lo que se escalaría bien. El valor exacto podría ser una etiqueta.

Esto probablemente solo debería usarse si tiene tiene una representación gráfica por algún motivo.

19
No

con ggplot, pero con plotrix que puede hacer fácilmente que:

library(plotrix) 
gap.barplot(df$a, gap=c(5,495),horiz=T) 
5

No, lamentablemente no

El temor es que permiten ejes discontinuos dará lugar a engaño de la audiencia. Sin embargo, hay casos en los que no tener un eje discontinua conduce a la distorsión.

Por ejemplo, si el eje se trunca, pero generalmente se encuentra dentro de algún intervalo (digamos [0,1]), el público puede no notar el truncamiento y hacer conclusiones distorsionadas sobre los datos. En este caso, un eje discontinuo explícito sería más apropiado y transparente.

Compare:

Example of good use of continuous vs discontinuous axis

Cuestiones relacionadas