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

Respuestas a la pregunta(1)

Su respuesta a la pregunta