2012-10-09 23 views
16

Estoy tratando de usar position_dodge en ggplot para obtener boxplots de dos señales diferentes (ind) compartiendo las mismas categorías (cat). Cuando hay una categoría con datos para una señal pero no para la otra, el diagrama de caja para la señal con datos cubre todo el espaciado horizontal, y no respeta la instrucción position_dodge para esa categoría en particular. ¿Hay alguna manera de hacer ggplot para hacer cumplir la regla de esquivar? Como puede ver en el siguiente ejemplo, la señal x no tiene datos para la categoría B, por lo que pierde el espacio reservado por position_dodge. Me gustaría evitar eso.¿Cómo hacer valer el position_dodge de ggplot en categorías sin datos?

Gracias de antemano.

data<-data.frame(cat=c('A','A','A','A','B','B','A','A','A','A','B','B'), 
       values=c(3,2,1,4,NA,NA,4,5,6,7,8,9), 
       ind=c('x','x','x','x','x','x','y','y','y','y','y','y')) 

print(ggplot() + 
     scale_colour_hue(guide='none') + 
     geom_boxplot(
      aes(x=as.factor(cat), y=values, 
       fill=ind), 
      position=position_dodge(width=.60), 
      data=data, 
      outlier.size = 1.2, 
      na.rm=T)) 

graph with original problem

progreso de la actualización

Después de algunas soluciones, se me ocurrió con el resultado que estaba buscando ... (tipo de)

data   <- data.frame(
cat=c('A','A','A','A','B','B','A','A','A','A','B','B','B'), 
values=c(3,2,1,4,NA,NA,4,5,6,7,8,9, 0), 
ind=c('x','x','x','x','x','x','y','y','y','y','y','y','x')) 

p <- ggplot() + 
     scale_colour_hue(guide='none') + 
     geom_boxplot(aes(x=as.factor(cat), y=values, fill=ind), 
     position=position_dodge(width=.60), 
     data=data, 
     outlier.size = 1.2, 
     na.rm=T) + 
     geom_line(aes(x=x, y=y), 
       data=data.frame(x=c(0,3),y=rep(0,2)), 
       size = 1, 
       col='white') 
print(p) 

solution with workaround

Algunas personas remcomieron utilizando facetas para el efecto I w anted. Faceting no me da el efecto que estoy buscando. El gráfico final que estaba buscando se muestra a continuación:

final graph

Si te fijas, la principal marca de la señal blanca en y = 10 es más gruesa que las otras marcas de graduación. Esta línea más gruesa es geom_line con tamaño = 1 que oculta diagramas de caja no deseados.

Ojalá pudiéramos combinar diferentes objetos geom más a la perfección. Informé de esto como un error en el github de Hadley, pero Hadley dijo que así es como position_dodge se comporta por diseño. Supongo que estoy usando ggplot2 de una manera no estándar y las soluciones alternativas son la forma de abordar este tipo de problemas. De todos modos, espero que esto ayude a algunos de los R a impulsar la gran funcionalidad de ggplot un poco más.

+1

¿Hay alguna forma mejor de manejar esto 2.5 años después? Tengo la misma situación. He intentado usar expand.grid() para crear un conjunto de datos con NA para todas las combinaciones de niveles de factores faltantes de la variable que estoy trazando, y parecen simplemente ignorarse. – Michael

+0

https://github.com/hadley/ggplot2/issues/688 Quizás no :( – Michael

+0

I que había. Envolví el código ggplot en una función e hice que la línea blanca del eje y colocara un parámetro de esta función La razón es que si los datos cruzan y = 0, caerán debajo de la línea blanca, lo que hará que la solución sea demasiado obvia y distraiga. – JAponte

Respuesta

1

Después de algunas soluciones, se me ocurrió con el resultado que estaba buscando ... (tipo de)

data   <- data.frame(
cat=c('A','A','A','A','B','B','A','A','A','A','B','B','B'), 
values=c(3,2,1,4,NA,NA,4,5,6,7,8,9, 0), 
ind=c('x','x','x','x','x','x','y','y','y','y','y','y','x')) 

p <- ggplot() + 
     scale_colour_hue(guide='none') + 
     geom_boxplot(aes(x=as.factor(cat), y=values, fill=ind), 
     position=position_dodge(width=.60), 
     data=data, 
     outlier.size = 1.2, 
     na.rm=T) + 
     geom_line(aes(x=x, y=y), 
       data=data.frame(x=c(0,3),y=rep(0,2)), 
       size = 1, 
       col='white') 
print(p) 

solution with workaround

Algunas personas recomiendan el uso de tallar para el efecto que quería. Faceting no me da el efecto que estoy buscando. El gráfico final que estaba buscando se muestra a continuación:

final graph

Si te fijas, la principal marca de la señal blanca en y = 10 es más gruesa que las otras marcas de graduación. Esta línea más gruesa es geom_line con tamaño = 1 que oculta diagramas de caja no deseados.

Ojalá pudiéramos combinar diferentes objetos geom más a la perfección. Informé de esto como un error en el github de Hadley, pero Hadley dijo que así es como position_dodge se comporta por diseño. Supongo que estoy usando ggplot2 de una manera no estándar y las soluciones alternativas son la forma de abordar este tipo de problemas. De todos modos, espero que esto ayude a algunos de los R a impulsar la gran funcionalidad de ggplot un poco más.

2

x de B no tiene valores, por lo que puede agregar "B", 0, "x" que esencialmente indica que no hay distribución de "valores" para x de B. La mediana y otros percentiles son cero.

data<-data.frame(cat=c('A','A','A','A','B','B','A','A','A','A','B','B','B'), 
      values=c(3,2,1,4,NA,NA,4,5,6,7,8,9,0), 
      ind=c('x','x','x','x','x','x','y','y','y','y','y','y','x')) 

También usted no tiene que añadir parámetros de posición aquí, porque cuando se tiene en cuenta como factor x, ggplot - geom_boxplot automágicamente esquivar a los lados.

print(ggplot() + 
    scale_colour_hue(guide='none') + 
    geom_boxplot(aes(x=as.factor(cat), y=values, fill=ind), 
    data=data, 
    outlier.size = 1.2, 
    na.rm=T)) 

+3

Esto puede ser un poco erróneo ading IMO. La solución ideal no tendría gráficos de caja o "líneas" en cero. Tal como está, para mí esto diría que 'x' para B tiene valores en 0, que no es el efecto deseado. –

+0

@ RomanLuštrik: En esa situación ideal, me gustaría ir con un diagrama de cajas sin espacio asignado para "x de B" y esto es lo que hago en mi investigación. Si uso los valores 0 para "x de B", entonces incluiría una pequeña descripción de cuál es el valor de referencia para los valores ~ factor (cat). Depende de cómo uno interpreta sus resultados. OP intentaba usar los parámetros de position_dodge que, de hecho, ya se han implementado cuando los valores de x son categóricos. – Sathish

+0

Gracias por los comentarios @Sathish! Esto es un gran comienzo. El parámetro Dodge se establece en .6, de modo que los diagramas de caja relacionados se solapen lo suficiente como para reflejar su relación, pero no tanto que terminen ocultando datos parcialmente.Podría vivir con cajas ficticias para categorías sin valores, pero tal vez necesito que sean transparentes para los casos vacíos. Simplifiqué el problema tanto como pude antes de publicar, pero el gráfico original es un poco más complejo. Puede incluir muchas más (más de 50) categorías en el eje x. – JAponte

1

acabo de recibir una pista para usar facetas de uno de los comentarios publicados por Hadley en su git site, por lo que los créditos va a Hadley, el mantenedor del paquete ggplot2!

Vea si esto es lo que quería.Para obtener más información acerca de las opciones sobre la configuración de las patillas y otros en esta parcela, compruebe esta página de ayuda en el paquete ggplot2:

?stat_boxplot 

data<-data.frame(cat=c('A','A','A','A','B','B','A','A','A','A','B','B'), 
      values=c(3,2,1,4,NA,NA,4,5,6,7,8,9), 
      ind=c('x','x','x','x','x','x','y','y','y','y','y','y')) 

p <- ggplot(data = data, aes(factor(cat), values))      
p + stat_boxplot(geom="boxplot", position = "dodge", width = 0.60, na.rm = TRUE) + facet_grid(.~ind) 

enter image description here

Para añadir colores a su trama, que en mi opinión es un ser redundante como ya está facetado la trama basada en la "ind" variables, intente esto:

p <- ggplot(data, aes(factor(cat), values, fill = ind))      
p + stat_boxplot(geom="boxplot", position = "dodge", width = 0.60, na.rm = TRUE) + facet_grid(.~ind) 

enter image description here

HTH !

+0

Se me ocurrió que debería haberle sugerido que use facetas antes en lugar de agregar puntos de datos de referencia adicionales para completar los valores que faltan, y recuerdo bien sobre la facetación del libro de Hadley en ggplot2. – Sathish

+0

Gracias por su ayuda @athish. Respondí mi propia pregunta, pero aún no la acepté porque Hadley ahora piensa que mi solución no debería ser necesaria. Volvió a abrir el informe de error que presenté hace unos días. Le doy otra semana para ver si tenemos una solución definitiva. ¡Gracias de nuevo! – JAponte

+0

¡Genial! No sabía que informaste en GIT, de todas maneras te pasamos el dedo y espero que alguien te brinde las opciones requeridas en él. – Sathish

Cuestiones relacionadas