2012-07-20 8 views
22

Tengo un marco de datos que captura varias medidas en el tiempo que me gustaría visualizar una faceta de 3x1. Sin embargo, cada medida contiene diferentes unidades/escalas que se beneficiarían de transformaciones personalizadas y esquemas de etiquetado.Formateo de etiquetas de ejes variables por faceta en ggplot/R

Por lo tanto, mi pregunta es: Si las unidades y escalas son diferentes en diferentes facetas, ¿cómo puedo especificar un formateador personalizado o transformación (es decir, log10) a un eje particular dentro de una faceta?

Por ejemplo, digamos que tengo los datos:

df = data.frame(dollars=10^rlnorm(50,0,1), counts=rpois(50, 100)) 
melted.df = melt(df, measure.var=c("dollars", "counts")) 

¿Cómo se podría ir en el establecimiento de una faceta 2x1 muestra dólares y los recuentos por encima del índice con labels=dollars y scale_y_continuous(trans = "log10", ...) para los datos df$dollars?

¡Gracias!

+0

no es fácil, creo ... –

+0

Sí. Shucks. Acabo de encontrar este enlace donde alguien tenía un problema similar: http://comments.gmane.org/gmane.comp.lang.r.ggplot2/4496. –

+0

Probablemente sea más fácil hacer dos parcelas separadas y organizarlas juntas. –

Respuesta

40

Como descubriste, no hay una solución fácil para esto, pero surge mucho. Dado que este tipo de cosas se hacen con tanta frecuencia, me resulta útil explicar por qué es difícil y sugerir una posible solución.

Mi experiencia ha sido que la gente que viene a ggplot2 o celosía gráficos fundamentalmente malinterpretar el propósito de facetas (o espalderas, en celosía). Esta característica fue desarrollada con una idea muy específica en mente: la visualización de datos a través de múltiples grupos que comparten una escala común. Viene de algo llamado principio de pequeños múltiplos, propugnado por Tufte y otros.

Colocar los paneles uno al lado del otro con escalas muy diferentes es algo que los expertos en diseño visual tenderán a evitar, ya que puede ser, en el mejor de los casos, engañoso. (No te estoy regañando aquí, solo explicando el razonamiento ...)

Pero, por supuesto, una vez que tienes esta gran herramienta a la vista, nunca sabes cómo la van a usar. Por lo tanto, se alarga: las solicitudes entran en la capacidad de permitir que las escalas varíen según el panel, y establecer varios aspectos de la gráfica por separado para cada panel. Y así faceting en ggplot2 se ha ampliado mucho más allá de su intención original.

Una consecuencia de esto es que algunas cosas son difíciles de implementar simplemente debido a la intención original del diseño de la función. Esta es probablemente una de esas instancias.

Ok, suficiente explicación. Aquí está mi solución.

El truco aquí es reconocer que no están trazando gráficos que comparten una escala. Para mí, eso significa que ni siquiera deberías pensar en usar facetas. En su lugar, hacer que cada parcela por separado y colocarlos juntos en una parcela:

library(gridExtra) 

p1 <- ggplot(subset(melted.df,variable == 'dollars'), 
       aes(x = value)) + 
      facet_wrap(~variable) + 
      geom_density() + 
      scale_x_log10(labels = dollar_format()) 

p2 <- ggplot(subset(melted.df,variable == 'counts'), 
       aes(x = value)) + 
      facet_wrap(~variable) + 
      geom_density() 

grid.arrange(p1,p2) 

enter image description here

yo sólo he adivinado lo que geom_* desea utilizar, y estoy seguro de que esto no es realmente lo que quería trazar, pero al menos ilustra el principio.

+0

¡Gracias por la respuesta perspicaz! Entiendo completamente las implicaciones de desviarme de las intenciones de diseño originales para ggplot2. En términos prácticos, tengo dos conjuntos de datos donde uno sigue una distribución normal, mientras que el otro sigue una distribución log-normal, por lo que esperaba poder comparar esos datos visualmente normalizados a lo largo del tiempo. ¿Tiene alguna idea sobre cómo alinear correctamente las áreas de trazado? Me encontré con la biblioteca 'ggExtra' antes, que supuestamente proporciona algún soporte ad-hoc para eso, pero apreciaría cualquier dirección con eso. –

+0

@StefanNovak ¡Me alegra que haya sido útil! Quiero enfatizar nuevamente que no estaba criticando sus elecciones de diseño. Un principio de las preguntas de SO es que "viven para siempre" y, por lo tanto, deberían ayudar a servir más que solo al asker original. Como dije, esto aparece una y otra vez, por lo que mi explicación estaba más dirigida a lectores futuros que a ti específicamente. – joran

+1

@StefanNovak Bueno, la forma estrafalaria de hacerlo es ajustar las etiquetas de los ejes de manera que tengan el mismo número de dígitos, incluso si eso significa rellenar las etiquetas con espacios en blanco. Estoy seguro de que eso también se ha preguntado antes ... Veré si puedo encontrar algo conventual. – joran

Cuestiones relacionadas