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