Ich möchte ein gestapeltes Balkendiagramm (oder Pfeildiagramm) erstellen, vorzugsweise ggplot2
, mit den Beispieldaten d
unten für jedes id
.gestapeltes Balkendiagramm mit einigen negativen Werten und geordneten Kategorien
Die Besonderheit ist, dass ich für den Stapel möchte die Spalte bestellen v0
erste, z1
zweite und dritte z2
(Daten in Wide Format) zu folgen. Beachten Sie jedoch, dass z2
einige negative Werte hat. Es sollte also irgendwie durch einen Pfeil oder etwas dargestellt werden, von oben nach unten (oder höher, abhängig vom Wert von z3
).
Gibt es eine Möglichkeit, dies zu tun?
d <- data.frame(
id=c('AAA','BBB','CCC','DDD','EEE','FFF'),
v0 =c(50 , 60 , 40 , 50 , 70 ,40),
z1 =c(20 , 15 , 5 , 40 , 5 , 40),
z2 =c(-10 , 5 , 10 ,-20 , 15 ,-15)
)
#normaly people transform the data to long format:
d %>% gather(ef_type, value,v0:d2) %>%
ggplot(aes(...) + geom_bar(...)
OBS: Beachten Sie, dass dies aus der Antwort auf this related question verschieden ist, in dem die Reihenfolge der Spalten spielt keine Rolle, und die negativen Werte werden in dem negativen Teil der Y-Achse dargestellt.
EDIT1: basierend auf @fanli Antwort brüllen ich den folgenden Code versucht:
d %>% select(id,v0,z1) %>% gather(ef_type, value,v0:z1) -> df
d %>% mutate(z2_start=v0+z1,z2_end=v0+z1+z2) %>% select(id,z2_start,z2_end) -> df2
ggplot(df, aes(x=id,y=value,fill=ef_type))+ geom_bar(stat = "identity") +
+ geom_segment(data=df2, aes(x=id, xend=id, y=z2_start, yend=z2_end), arrow = arrow(length = unit(0.02, "npc")))
#which results in the error:
Error: ggplot2 doesn't know how to deal with data of class uneval
cool. Es ist mehr oder weniger was ich will. Die Kategorie z2 sollte nicht als Balken angezeigt werden, nur als Pfeil, beginnend bei "v0 + z1" und endend bei "v0 + z1-z2" – LucasMation
Das ist großartig! Das einzige Problem, das bei diesem Diagramm verbleibt, ist, dass es sinnvoll wäre, einen Wert für die Legende anzugeben. Nehmen wir an, die Bezeichnungen sind v0: "base level"; z1: "Wirkung A"; z2 (Pfeil) "Wirkung B". Kann das irgendwie in der Legende enthalten sein? – LucasMation
verwendest du reshape2 :: schmelzen? Ich habe versucht, Ihren Code in meinem PC zu replizieren, aber ich bekomme einen Fehler: Fehler in + geom_bar (stat = "Identität", Position = "Stapel"): ungültiges Argument zu unärer Operator – LucasMation