Emitir com ggplot2, geom_bar e position = “dodge”: o stacked tem valores y corretos, dodged não

Estou tendo bastante compreensão do tempogeom_bar() eposition="dodge". Eu estava tentando fazer alguns gráficos de barras ilustrando dois grupos. Originalmente, os dados eram de dois quadros de dados separados. Poressa questão, Eu coloquei meus dados em formato longo. Meu exemplo:

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))

Eu uso esse exemplo como é semelhante ao exemplo de gasto versus orçamento. Gastar tem muitas linhas pornames nível de fator, enquanto o orçamento tem apenas um (um valor de orçamento por categoria).

Para um gráfico de barras empilhadas, isso funciona muito bem:

ggplot(df, aes(x=factor(names), y=values, fill=factor(num))) +
geom_bar(stat="identity")

Em particular, observe o valor y maxes. São as somas dos dados detest com os valores detest2 mostrado em azul no topo.

Com base em outras perguntas que li, simplesmente preciso adicionarposition="dodge" para torná-lo um gráfico lado a lado versus um gráfico empilhado:

ggplot(df, aes(x=factor(names), y=values, fill=factor(num))) + 
geom_bar(stat="identity", position="dodge")

Parece ótimo, mas observe os novos valores max y. Parece que está apenas tomando o valor máximo de y de cada nível de fator de nomes detest para o valor y. Não está mais resumindo.

Por algumas outras perguntas (comoeste eeste, Eu também tentei adicionar ogroup= opção sem sucesso (produz o mesmo gráfico esquivo como acima):

ggplot(df, aes(x=factor(names), y=values, fill=factor(num), group=factor(num))) +
geom_bar(stat="identity", position="dodge")

Eu não entendo por que o stacked funciona muito bem e o dodged não apenas os coloca lado a lado ao invés de no topo.

ETA: Achei umpergunta recente sobre isso no grupo do Google ggplot com a sugestão de adicionaralpha=0.5 para ver o que está acontecendo. Não é que ggplot esteja tirando o valor máximo de cada agrupamento; na verdade, há excesso de plotagem de barras uma em cima da outra para cada valor.

Parece que ao usarposition="dodge", ggplot espera apenas um y por x. Eu entrei em contato com Winston Chang, um desenvolvedor ggplot sobre isso para confirmar, bem como para saber se isso pode ser alterado, como eu não vejo uma vantagem.

Parece questat="identity" deve dizer ggplot para contar oy=val passou por dentroaes() em vez de contagens individuais, o que acontece semstat="identity" e ao passar nenhum valor y.

Por enquanto, a solução alternativa parece ser (para o original df acima) agregar, portanto, há apenas um 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

questionAnswers(1)

yourAnswerToTheQuestion