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))
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)
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:
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.
¿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
https://github.com/hadley/ggplot2/issues/688 Quizás no :( – Michael
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