2016-08-08 17 views
0

Ich muss ein Diagramm erstellen, in dem ein Histogramm von einer Dichte überlagert wird. Hier ist mein Ergebnis so weit einige Beispiel Daten:ggplot2: Legendensymbole im überlagerten Plot anpassen

enter image description here

library("ggplot2") 

set.seed(1234) 
a <- round(rnorm(10000, 5, 5), 0) 
b <- rnorm(10000, 5, 7) 
df <- data.frame(a, b) 

ggplot(df) + 
    geom_histogram(aes(x = a, y = ..density.., col = "histogram", linetype = "histogram"), fill = "blue") + 
    stat_density(aes(x = b, y = ..density.., col = "density", linetype = "density"), geom = "line") + 
    scale_color_manual(values = c("red", "white"), 
       breaks = c("density", "histogram")) + 
    scale_linetype_manual(values = c("solid", "solid")) + 
    theme(legend.title = element_blank(), 
     legend.position = c(.75, .75), 
     legend.text = element_text(size = 15)) 

Leider kann ich nicht herausfinden, wie ich die Symbole in der Legende richtig ändern kann. Das erste Symbol sollte eine relativ dicke rote Linie sein und das zweite Symbol sollte ein blaues Feld ohne die weiße Linie in der Mitte sein.

Basierend auf einigen Internet-Recherche habe ich versucht, habe ich versucht, verschiedene Dinge in scale_linetype_manual und weiter zu verändern override.aes zu verwenden, aber ich konnte nicht herausfinden, wie ich es in diesem speziellen Fall verwenden müssten.


EDIT - Hier ist die beste Lösung, die unten auf die sehr hilfreichen Antworten.

ggplot(df) + 
    geom_histogram(aes(x = a, y = ..density.., linetype = "histogram"), 
       fill = "blue", 
# I added the following 2 lines to keep the white colour arround the histogram. 
       col = "white") + 
    scale_linetype_manual(values = c("solid", "solid")) + 
    stat_density(aes(x = b, y = ..density.., linetype = "density"), 
       geom = "line", color = "red") + 
    theme(legend.title = element_blank(), 
     legend.position = c(.75, .75), 
     legend.text = element_text(size = 15), 
     legend.key = element_blank()) + 
    guides(linetype = guide_legend(override.aes = list(linetype = c(1, 0), 
                fill = c("white", "blue"), 
                size = c(1.5, 1.5)))) 

enter image description here

Antwort

1

Wie Sie gedacht, können die meisten Arbeiten über override.aes für linetype erfolgen.

Hinweis Ich entfernte color aus der aes von beiden Schichten, um einige Probleme zu vermeiden, die ich mit der Legende Box Umriss hatte. Dadurch werden auch die Funktionsaufrufe scale_*_* vermieden. Um die Farbe der Dichtelinie einzustellen, verwendete ich color außerhalb von aes.

In override.aes stelle ich die linetype festen oder leer zu sein, die fill entweder weiß oder blau zu sein, und die size 2 oder 0 für die Dichte-Box und Histogramm-Box sein, respectively.

ggplot(df) + 
    geom_histogram(aes(x = a, y = ..density.., linetype = "histogram"), fill = "blue") + 
    stat_density(aes(x = b, y = ..density.., linetype = "density"), geom = "line", color = "red") + 
    theme(legend.title = element_blank(), 
      legend.position = c(.75, .75), 
      legend.text = element_text(size = 15), 
      legend.key = element_blank()) + 
    guides(linetype = guide_legend(override.aes = list(linetype = c(1, 0), 
                 fill = c("white", "blue"), 
                 size = c(2, 0)))) 

enter image description here

+1

Vielen Dank, das war die perfekte Lösung! Ich habe Ihrem Code zwei Zeilen hinzugefügt, weil ich die weiße Farbe um das Histogramm herum behalten möchte (siehe oben bearbeiteter Beitrag). – JSP

1

enter image description here Die fill und colour Ästhetik werden durch histogram und density jeweils markiert, und ihre Werte Satz scale_*_manual verwenden. Dies wird direkt der gewünschten Legende zugeordnet, ohne dass Überschreibungen erforderlich sind.

ggplot(df) + 
    geom_histogram(aes(x = a, y = ..density.., fill = "histogram")) + 
    stat_density(aes(x = b, y = ..density.., colour="density"), geom = "line") + 
    scale_fill_manual(values = c("blue")) + 
    scale_colour_manual(values = c("red")) + 
    labs(fill="", colour="") + 
    theme(legend.title = element_blank(), 
     legend.position = c(.75, .75), 
     legend.box.just = "left", 
     legend.background = element_rect(fill=NULL), 
     legend.key = element_rect(fill=NULL), 
     legend.text = element_text(size = 15)) 
+0

Vielen Dank für die tolle Antwort, obwohl ich die Lösung von Aosmith genommen habe, weil ich eine gemeinsame Legende für beide Symbole bevorzuge. – JSP