Problema con ggplot2, geom_bar y position = "dodge": apilados tienen valores de y correctos, esquivados no
Estoy teniendo bastante tiempo para entendergeom_bar()
yposition="dodge"
. Estaba tratando de hacer algunos gráficos de barras que ilustran dos grupos. Originalmente, los datos eran de dos marcos de datos separados. Poresta pregunta, Pongo mis datos en formato largo. Mi ejemplo
test <- data.frame(names=rep(c("A","B","C"), 5), values=1:15)
test2 <- data.frame(names=c("A","B","C"), values=5:7)
df <- data.frame(names=c(paste(test$names), paste(test2$names)), num=c(rep(1,
nrow(test)), rep(2, nrow(test2))), values=c(test$values, test2$values))
Utilizo ese ejemplo porque es similar al ejemplo de gasto frente a presupuesto. El gasto tiene muchas filas pornames
nivel de factor, mientras que el presupuesto solo tiene uno (una cantidad de presupuesto por categoría).
Para un gráfico de barras apiladas, esto funciona muy bien:
ggplot(df, aes(x=factor(names), y=values, fill=factor(num))) +
geom_bar(stat="identity")
En particular, tenga en cuenta el valor de y max. Son las sumas de los datos detest
con los valores detest2
se muestra en azul en la parte superior.
Basándome en otras preguntas que he leído, simplemente necesito agregarposition="dodge"
para convertirlo en una gráfica de lado a lado frente a una apilada:
ggplot(df, aes(x=factor(names), y=values, fill=factor(num))) +
geom_bar(stat="identity", position="dodge")
Se ve muy bien, pero tenga en cuenta los nuevos valores max y. Parece que solo está tomando el valor máximo y de cada nivel de factor de nombres detest
para el valor y. Ya no los está sumando.
Por algunas otras preguntas (comoéste yéste, También intenté agregar elgroup=
Opción sin éxito (produce la misma parcela esquivada que la anterior):
ggplot(df, aes(x=factor(names), y=values, fill=factor(num), group=factor(num))) +
geom_bar(stat="identity", position="dodge")
No entiendo por qué el apilado funciona muy bien y el esquivado no solo los pone uno al lado del otro en lugar de estar encima.
ETA: Encontre unpregunta reciente sobre esto en el grupo ggplot de google con la sugerencia de agregaralpha=0.5
para ver que esta pasando No es que ggplot esté tomando el valor máximo de cada agrupación; en realidad se trata de sobre-trazar barras una encima de la otra para cada valor.
Parece que al usarposition="dodge"
, ggplot espera solo una y por x. Me puse en contacto con Winston Chang, un desarrollador de ggplot, para confirmar y preguntar si se puede cambiar, ya que no veo ninguna ventaja.
Parece questat="identity"
debe decirle a ggplot que cuente lay=val
pasó adentroaes()
en lugar de cuentas individuales que sucede sinstat="identity"
y al pasar ningún valor y.
Por ahora, la solución parece ser (para el df original anterior) agregarse, de modo que solo hay una y por x:
df2 <- aggregate(df$values, by=list(df$names, df$num), FUN=sum)
p <- ggplot(df2, aes(x=Group.1, y=x, fill=factor(Group.2)))
p <- p + geom_bar(stat="identity", position="dodge")
p