Problem z ggplot2, geom_bar i position = „dodge”: stacked ma poprawne wartości y, dodged nie

Mam dość czasu na zrozumieniegeom_bar() iposition="dodge". Próbowałem stworzyć wykresy słupkowe ilustrujące dwie grupy. Pierwotnie dane pochodziły z dwóch oddzielnych ramek danych. Zato pytanie, Umieściłem moje dane w długim formacie. Mój przykład:

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

Używam tego przykładu, ponieważ jest on podobny do przykładu wydatków a budżetu. Wydatki mają wiele wierszy nanames poziom czynnika, podczas gdy budżet ma tylko jeden (jedna kwota budżetu na kategorię).

Dla wykresu słupkowego, działa to świetnie:

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

W szczególności zwróć uwagę na maxes wartości y. Są to sumy danych ztest z wartościamitest2 wyświetlany na niebiesko na górze.

Na podstawie innych pytań, które przeczytałem, po prostu muszę dodaćposition="dodge" uczynić z tego fabułę obok siebie:

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

Wygląda świetnie, ale zwróć uwagę na nowe maksymalne wartości y. Wygląda na to, że bierze po prostu maksymalną wartość y z każdego poziomu współczynnika nazwtest dla wartości y. Już ich nie sumuje.

Na kilka innych pytań (npten iten, Spróbowałem również dodaćgroup= opcja bez powodzenia (tworzy tę samą unikaną fabułę jak powyżej):

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

Nie rozumiem, dlaczego ułożone układy działają świetnie, a uniki nie po prostu układają je obok siebie, a nie na górze.

ETA: znalazłemostatnie pytanie o tym w grupie google ggplot z sugestią dodaniaalpha=0.5 aby zobaczyć, co się dzieje. Nie jest tak, że ggplot pobiera maksymalną wartość z każdej grupy; to właściwie nadpisywanie słupków jeden na drugim dla każdej wartości.

Wydaje się, że podczas korzystaniaposition="dodge", ggplot oczekuje tylko jednego y na x. Skontaktowałem się z Winstonem Changiem, deweloperem ggplot o tym, aby potwierdzić i zapytać, czy można to zmienić, ponieważ nie widzę przewagi.

Wygląda na to żestat="identity" powinien poinformować ggplot, aby skończyły=val przeszedł do środkaaes() zamiast indywidualnych obliczeń, które mają miejsce bezstat="identity" i kiedy nie przechodzi wartość y.

Na razie wydaje się, że obejście (dla oryginalnego df powyżej) agreguje, więc jest tylko jeden y na 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