Problem mit ggplot2, geom_bar und position = "dodge": stacked hat korrekte y-Werte, dodged nicht

Ich habe ziemlich viel Zeit zum Verständnisgeom_bar() undposition="dodge". Ich habe versucht, Balkendiagramme zu erstellen, die zwei Gruppen veranschaulichen. Ursprünglich stammten die Daten aus zwei separaten Datenrahmen. Prodiese FrageIch stelle meine Daten in ein langes Format. Mein Beispiel:

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

Ich verwende dieses Beispiel, da es dem Beispiel "Ausgaben vs. Budget" ähnelt. Ausgaben haben viele Zeilen pronames Faktorstufe, während das Budget nur eine hat (ein Budgetbetrag pro Kategorie).

Bei einem gestapelten Balkendiagramm funktioniert dies hervorragend:

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

Beachten Sie insbesondere die y-Wertmaxima. Sie sind die Summen der Daten vontest mit den Werten vontest2 oben in blau dargestellt.

Aufgrund anderer Fragen, die ich gelesen habe, muss ich nur hinzufügenposition="dodge" Um es zu einem Nebeneinanderplot im Vergleich zu einem gestapelten Plot zu machen:

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

Es sieht gut aus, aber beachte die neuen max y Werte. Es sieht so aus, als würde nur der maximale y-Wert aus jeder Namensfaktorstufe entnommentest für den y-Wert. Es summiert sie nicht mehr.

Per ein paar anderen Fragen (wiedieses unddiesesIch habe auch versucht, das hinzuzufügengroup= Option ohne Erfolg (erzeugt die selbe ausgeblendete Handlung wie oben):

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

Ich verstehe nicht, warum das Stapeln großartig funktioniert und das Ausweichen sie nicht einfach nebeneinander statt oben platziert.

ETA: Ich habe einen ... gefundenaktuelle Frage dazu auf der ggplot google gruppe mit dem vorschlag hinzuzufügenalpha=0.5 um zu sehen, was los ist. Es ist nicht so, dass ggplot den Maximalwert aus jeder Gruppierung entnimmt. Tatsächlich werden Balken für jeden Wert übereinander geplottet.

Es scheint, dass bei der Verwendungposition="dodge"ggplot erwartet nur ein y pro x. Ich kontaktierte Winston Chang, einen ggplot-Entwickler, um dies zu bestätigen und um zu fragen, ob dies geändert werden kann, da ich keinen Vorteil sehe.

Es scheint, dassstat="identity" sollte ggplot sagen, das zu zähleny=val drinnen vorbeigegangenaes() anstelle von Einzelzählungen, ohne die es gehtstat="identity" und wenn kein y-Wert übergeben wird.

Momentan scheint die Problemumgehung (für den obigen ursprünglichen df) zu aggregieren, sodass nur ein y pro x vorhanden ist:

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

Antworten auf die Frage(1)

Ihre Antwort auf die Frage