2017-06-23 11 views
1

Ich möchte einen gestapelten Barplot mit drei verschiedenen Legenden für verschiedene Gruppierungen von Daten erstellen.Mehrere Legenden für Barplot füllt in ggplot

Zum Beispiel angesichts der folgenden Datenrahmen:

Year <- as.factor(c(rep(1, 10), rep(2, 10), rep(3,10), rep(4,10), rep(5,10), rep(6,10))) 
Category <- as.factor(c(rep("a", 15), rep("b", 10), rep("c", 10), rep("d",10), rep("e", 10), rep("f", 5))) 
Region <- as.factor(c(rep("region1", 25), rep("region2", 20), rep("region3",15))) 
data <- data.frame(Year, Category, Region) 

Ich mag würde für Jahr eine gestapelte BarPlot der Zählung jeder Kategorie zeichnen.

ggplot() + geom_bar(data=data,aes(x=Year, fill=Category)) 

Anstatt jedoch für die Kategorie eine Legende, die (wie oben) Ich möchte drei Legenden nach Region mit Kategorie-Untermenge (dh die Legende dem Titel „region1“ würde Kategorien zeigen, „a“ und „b“ Die Legende mit dem Titel "region2" würde die Kategorien "c" und "d" anzeigen und die Legende "region3" würde die Kategorien "e" und "f" anzeigen und R: Custom Legend for Multiple Layer ggplot. Allerdings hatte ich kein Glück, sie auf einen Barplot anzuwenden.Eine Hilfe würde sehr geschätzt werden!

Antwort

0

Sie können manchmal diese Art der Sache "hart" Weg durch Zuordnen von Schichten zu zusätzlichen Ästhetik und dann mit override.aes, um die Legenden basierend auf diese Ästhetik aussehen, wie Sie sie wollen. Es ist nicht schön. Hier

ist ein Beispiel, wo die fill Legende unterdrückt wird und Legenden werden für die drei „Region“ Untergruppen über color, size und alpha gemacht.

Zuerst erhalten Sie die ggplot2 Farben für 6 Farben wie gezeigt here.

gg_color_hue = function(n) { 
    hues = seq(15, 375, length = n + 1) 
    hcl(h = hues, l = 65, c = 100)[1:n] 
} 

cols = gg_color_hue(6) 

Die drei Fremd geom_point Schichten sind nur enthalten, die drei Legenden zum Grundstück hinzuzufügen; Die tatsächlichen Punkte werden unterdrückt, indem size auf 0 oder color auf NA gesetzt wird.

Dann kommt die unordentliche Arbeit in guide_legend, wo jede Legende geändert wird, um die richtigen Farben basierend auf cols oben zu zeigen. Legendennamen werden geändert und die Legendenreihenfolge wird festgelegt.

ggplot(data = data, aes(x = Year)) + 
    geom_bar(aes(fill = Category), show.legend = FALSE) + 
    geom_point(data = subset(data, Category %in% c("a", "b")), 
       aes(color = Category), stat = "count", size = 0) + 
    geom_point(data = subset(data, Category %in% c("c", "d")), 
       aes(size = Category), stat = "count", color = NA) + 
    geom_point(data = subset(data, Category %in% c("e", "f")), 
       aes(alpha = Category), stat = "count", size = 0) + 
    guides(color = guide_legend(title = "Region 1", order = 1, 
           override.aes = list(shape = 15, size = 5, color = cols[1:2])), 
      size = guide_legend(title = "Region 2", order = 2, 
           override.aes = list(shape = 15, size = 5, color = cols[3:4])), 
      alpha = guide_legend(title = "Region 3", order = 3, 
           override.aes = list(shape = 15, size = 5, color = cols[5:6], alpha = 1))) + 
    theme(legend.key = element_rect(fill = "white")) 

enter image description here

+0

Dank - schätzen die Hilfe! – Powege

0

Was ist so etwas wie das:

ggplot() + geom_bar(data=data,aes(x=Year, fill=Category, color=Region)) + scale_fill_brewer(palette="Greens") + scale_color_manual(values = c("red", "black", "grey"))

mit scale_color_manual angepasst werden. Sie können sich inspirieren lassen von

Verwandte Themen