2015-04-09 16 views
9

Wie kann ich ggplot2 eine separate Legende für verschiedene Geome geben, die beide Farbe verwenden, um 2 verschiedene Variablen darzustellen. Ich möchte 3 Legenden, eine für z, a und b, aber eine & b scheinen zu einer einzigen Legende kombiniert werden, obwohl ein & b verschiedene Variablen darstellen. Ich würde auch gerne in der Lage sein, die Farben in jeder Legende zu steuern.ggplot2: Weisen Sie 2 verschiedenen Geoms Farbe zu und erhalten Sie 2 verschiedene Legenden

dat <- data.frame(
    y = rnorm(200), 
    x = sample(c("A", "B"), 200, TRUE), 
    z = sample(100:200, 200, TRUE), 
    a = sample(c("male", "female"), 200, TRUE), 
    b = factor(sample(1:2, 200, TRUE)) 
) 

ggplot(dat, aes(y = y, x = x)) + 
    geom_point(aes(color = a, size = z)) + 
    geom_boxplot(fill = NA, size=.75, aes(color=b)) + 
    scale_color_manual(values = c("#F8766D", "#00BFC4", "orange", "purple")) 

enter image description here

+0

Wahrscheinlich ein einfacher Weg, aber man zwei Parzellen tun könnte und dann die Legenden verbinden ... http://stackoverflow.com/questions/26727741/how-to-show-a-legend -on-dual-y-axis-ggplot/26742226 # 26742226 – user20650

+0

@ user20650 Ich dachte darüber nach und werde diese Route gehen, wenn es sein muss, aber es scheint so, als sollte es einen einfacheren Weg geben. –

+0

Ich kann sehen, warum Sie sie getrennt haben möchten, aber für jede andere Ästhetik (Transparenz, Größe, Form, Farbbalken, etc.), macht es keinen Sinn, sie zu trennen. zB Transparenz 0-25 ist eine Variable und die andere Variable ist 26-50, es ist die gleiche Skala. natürlich können Farben diskreter sein, so dass es mehr Sinn machen könnte ... nur meine Idee, warum das nicht einfach ist. hadley ist sehr speziell über seine ggplot – rawr

Antwort

10

Wenn Sie ein gefülltes Plotten Symbol verwenden, können Sie einen Faktor Karte zu füllen und die andere Farbe, die sie dann in zwei Skalen trennt und daher Legenden.

ggplot(dat, aes(y = y, x = x)) + 
    geom_point(aes(fill = a, size = z), pch = 21) + 
    geom_boxplot(fill = NA, size=.75, aes(color=b)) + 
    scale_color_manual(values = c("orange", "purple")) + 
    scale_fill_manual(values = c("#F8766D", "#00BFC4")) 

enter image description here

+0

Danke. Für diese spezielle Situation denke ich, dass diese Methode einfach ist und was die meisten Leute wählen würden. –

2

Es scheint, dass die Legende Capture-Ansatz des verallgemeinerbar in ähnlichen Situationen, wenn auch in diesem speziellen auf @ jennybryan das ist einfacher und wahrscheinlich das, was die meisten Menschen wünschen würden. Ich dokumentiere auch den Ansatz der Legendenerfassung. Ich lernte diesen Ansatz zuerst von @Sandy Muspratt .

enter image description here

dat <- data.frame(
    y = rnorm(200), 
    x = sample(c("A", "B"), 200, TRUE), 
    z = sample(100:200, 200, TRUE), 
    a = sample(c("male", "female"), 200, TRUE), 
    b = factor(sample(1:2, 200, TRUE)) 
) 

if (!require("pacman")) install.packages("pacman") 
pacman::p_load(ggplot2, grid, gridExtra, gtable) 

coldot <- ggplot(dat, aes(y = y, x = x)) + 
    geom_point(aes(color = a, size = z)) + 
    #geom_boxplot(fill = NA, size=.75, aes(color=b)) + 
    scale_color_manual(values = c("#F8766D", "#00BFC4")) 

colbox <- ggplot(dat, aes(y = y, x = x)) + 
    #geom_point(aes(color = a, size = z)) + 
    geom_boxplot(fill = NA, size=.75, aes(color=b)) + 
    scale_color_manual(values = c("orange", "purple")) 



leg1 <- gtable_filter(ggplot_gtable(ggplot_build(coldot)), "guide-box") 
leg1Grob <- grobTree(leg1) 

leg2 <- gtable_filter(ggplot_gtable(ggplot_build(colbox)), "guide-box") 
leg2Grob <- grobTree(leg2) 


noleg <- ggplot(dat, aes(y = y, x = x)) + 
    geom_point(aes(color = a, size = z)) + 
    geom_boxplot(fill = NA, size=.75, aes(color=b), position=position_dodge(1)) + 
    scale_color_manual(values = c("orange", "purple", "#F8766D", "#00BFC4")) + 
    theme(
     plot.margin = unit(c(5.1, 4.1, 4.1, 2.1), "pt"), 
     legend.position=c(1.3, 0.87) 
    ) + 
    guides(color = FALSE) 

legs <- ggplot(data = data.frame(x=1, y=1)) + 
    geom_blank(aes(x=x, y=y)) + 
    theme_minimal() + 
    ylab(NULL) + xlab(NULL) + 
    theme(
     axis.text = element_blank(), 
     axis.ticks = element_blank(), 
     panel.grid.major = element_blank(), 
     panel.grid.minor = element_blank() 
    ) + 
    annotation_custom(leg1Grob, xmin=1, xmax=1, ymin=.95, ymax=1.3) + 
    annotation_custom(leg2Grob, xmin=.6, xmax=.8, ymin=.75, ymax=1) 

out <- arrangeGrob(noleg, legs, ncol=2, widths=c(.85, .15)) 
print(out) 
Verwandte Themen