2010-12-02 5 views
9

Ich bin auf der Suche nach einer Möglichkeit, ein Balkendiagramm mit zwei verschiedenen Serien zu zeichnen, die Balken für eine der Serien ausblenden und stattdessen eine Linie (glatt wenn möglich) durch die Spitze der Bars für die versteckte Serie gehen würde (ähnlich wie man ein Freq-Polynom in einem Histogramm überlagern könnte). Ich habe das folgende Beispiel ausprobiert, scheint aber zwei Probleme zu haben.Wie kann eine Linie mit ggplot2 über ein Balkendiagramm gelegt werden?

Zuerst muss ich (total) die Daten nach Gruppe zusammenfassen, und zweitens möchte ich eine der Serien (df2) in eine Zeile umwandeln.

df <- data.frame(grp=c("A","A","B","B","C","C"),val=c(1,1,2,2,3,3)) 
df2 <- data.frame(grp=c("A","A","B","B","C","C"),val=c(1,4,3,5,1,2)) 
ggplot(df, aes(x=grp, y=val)) + 
    geom_bar(stat="identity", alpha=0.75) + 
    geom_bar(data=df2, aes(x=grp, y=val), stat="identity", position="dodge") 

Antwort

11

Vielleicht ist Ihre Beispieldaten sind nicht repräsentativ für die tatsächlichen Daten, die Sie mit arbeiten, aber es gibt keine Linien für df2 gezogen werden. Es gibt nur einen Wert für jeden x- und y-Wert. Hier ist eine modifed Version Ihrer df2 mit genügend Datenpunkte Linien zu konstruieren:

df <- data.frame(grp=c("A","A","B","B","C","C"),val=c(1,2,3,1,2,3)) 
df2 <- data.frame(grp=c("A","A","B","B","C","C"),val=c(1,4,3,5,0,2)) 

p <- ggplot(df, aes(x=grp, y=val)) 
p <- p + geom_bar(stat="identity", alpha=0.75) 

p + geom_line(data=df2, aes(x=grp, y=val), colour="blue") 

Alternativ, wenn Ihr Beispiel Daten über korrekt ist, können Sie diese Informationen als ein Punkt mit geom_point(data = df2, aes(x = grp, y = val), colour = "red", size = 6) plotten. Sie können natürlich die Farbe und Größe nach Ihren Wünschen ändern.

EDIT: Als Antwort

Ich Kommentar bin nicht ganz sicher, was die visuelle für ein Freq Polynom über ein Histogramm aussehen soll. Sollen die x-Werte miteinander verbunden sein? Zweitens, Sie beziehen sich immer auf die Suche nach Zeilen, aber Ihr Code zeigt geom_bar() was ich nehme an, ist nicht das, was Sie wollen? Wenn Sie Linien möchten, verwenden Sie geom_lines(). Wenn die beiden obigen Annahmen richtig sind, dann ist hier ein Ansatz, um das zu tun:

#First let's summarise df2 by group 
df3 <- ddply(df2, .(grp), summarise, total = sum(val)) 
> df3 
    grp total 
1 A  5 
2 B  8 
3 C  3 

#Second, let's plot df3 as a line while treating the grp variable as numeric 

p <- ggplot(df, aes(x=grp, y=val)) 
p <- p + geom_bar(alpha=0.75, stat = "identity") 
p + geom_line(data=df3, aes(x=as.numeric(grp), y=total), colour = "red") 
+0

Eigentlich, ich suche nach einer Möglichkeit, im Wesentlichen ein Balkendiagramme zu zeichnen zwei verschiedene Serien enthalten, verstecken einer der Bars und stattdessen eine Linie haben (glatt, wenn möglich) gehen durch die obere von wo die Balken für die verborgene Reihe gewesen wären (ähnlich wie man ein Freq-Polynom in einem Histogramm überlagern könnte). – user338714

+0

Ich habe die ursprüngliche Frage geklärt. Danke für deine Hilfe bis jetzt - es sieht so aus als ob ich einen Schritt verpasse, um die Daten zusammenzufassen. – user338714

+0

@ user338714 - aktualisierte Antwort, ich bin immer noch ein wenig unklar, was Sie wirklich hier sind. Wenn das was Sie wollen nicht oben ist, können Sie ein Beispiel für das endgültige Bild finden, das Sie haben möchten? – Chase

17

Sie können Gruppensummen auf viele Arten erhalten. Eine davon ist

Der Einfachheit halber können Sie Balken- und Zeilendaten in einem einzigen Dataset kombinieren.

df_all <- data.frame(grp = factor(levels(df$grp))) 
df_all$bar_heights <- with(df, tapply(val, grp, sum)) 
df_all$line_y <- with(df2, tapply(val, grp, sum)) 

Balkendiagramme verwenden eine kategoriale X-Achse. Um eine Linie zu überlagern, müssen Sie die Achse in einen numerischen Wert konvertieren.

ggplot(df_all) + 
    geom_bar(aes(x = grp, weight = bar_heights)) + 
    geom_line(aes(x = as.numeric(grp), y = line_y)) 

enter image description here

+0

Schöne Antwort (+1)! Ich mag diesen Ansatz. Ich schätze, es kommt darauf an, woher die ursprünglichen Quelldaten kommen, die weniger codiert werden müssen. – Chase

Verwandte Themen