2016-04-07 15 views
0

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 

Antwort

4

Sie sind für so etwas suchen?

df <- melt(d) 
df$absvalue <- abs(df$value) 
df <- ddply(df, .(id), transform, pos = 
    ifelse(value<0, cumsum(absvalue)-(0.4 * absvalue), 
    cumsum(absvalue)-(0.6 * absvalue))) 
df <- ddply(df, .(id), transform, pos2 = 
    ifelse(value>0, cumsum(absvalue)-(0.4 * absvalue), 
    cumsum(absvalue)-(0.6 * absvalue))) 
ggplot(df, aes(x=id,y=absvalue,group=variable,fill=variable)) 
    + geom_bar(stat="identity", position="stack") 
    + geom_segment(aes(x=id, xend=id, y=pos, yend=pos2), arrow = arrow(length = unit(0.02, "npc"))) 

enter image description here

Sie können mit der Position/Anzahl/Größe der Pfeile spielen, aber geom_segment scheint wie eine Möglichkeit für das, was Sie möchten.

Edit: Basierend auf Klärung der gewünschten Ausgabe:

df < - Schmelze (d)

ggplot(subset(df, variable!="z2"), aes(x=id,y=value,group=variable,fill=variable)) 
+ geom_bar(stat="identity", position="stack") + geom_segment(data=d, 
    aes(x=id, xend=id, y=v0+z1, yend=v0+z1+z2), arrow = arrow(length = unit(0.02, "npc")), inherit.aes=F) 

enter image description here

Edit 2: Verwenden Sie scale_fill_manual und scale_color_manual Ihre Legende Schlüssel anpassen:

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) 
) 
d$cc <- "effect B" 
df <- melt(d) 
ggplot(subset(df, variable!="z2"), aes(x=id,y=value,group=variable,fill=variable)) + geom_bar(stat="identity", position="stack") + geom_segment(data=d, aes(x=id, xend=id, y=v0+z1, yend=v0+z1+z2, color=cc), arrow = arrow(length = unit(0.02, "npc")), inherit.aes=F) + scale_color_manual(values="black") + scale_fill_manual(values=c("skyblue", "red"), labels=c("base level", "effect A")) 
+0

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

+0

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

+0

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

Verwandte Themen