2016-11-15 3 views
5

Ich versuche alpha zu kombinieren und füllen Sie ggplot2. Es funktioniert, wenn ich geom_bar (oder geom_points, für Farbe) verwende, aber die Alpha-Legende funktioniert nicht, wenn ich geom_boxplot verwende.Alpha und füllen Legenden in ggplot2 boxplots?

library(data.table) 
library(ggplot2) 
dt = data.table(x = rep(1:5,6), y = rnorm(30), tag1 = rep(c('hey', 'what'), 15), tag2 = rep(c('yeah', 'yeah', 'so', 'so', 'so'), 6)) 

Es funktioniert für Bars:

ggplot(dt[, list(y=mean(y)), by=list(x, tag1, tag2)], aes(x=x, y=y, fill=tag1, alpha=tag2, group=interaction(x,tag1,tag2))) + geom_bar(stat = 'identity', position = 'dodge') 

enter image description here

Aber nicht für boxplot - die Alpha-Legende ist leer.

ggplot(dt, aes(x=x, y=y, fill=tag1, alpha=tag2, group=interaction(x,tag1,tag2))) + geom_boxplot() 

enter image description here

Eine einfachere Version kann ohne Füllung erfolgen - es ist wie bar Standardwerte scheint/hellgrau bis grau und boxplot standardmäßig Weiß/lightwhite:

ggplot(dt[, list(y=mean(y)), by=list(x, tag2)], aes(x=x, y=y, alpha=tag2, group=interaction(x,tag2))) + geom_bar(stat = 'identity') 

enter image description here

ggplot(dt, aes(x=x, y=y, alpha=tag2, group=interaction(x,tag2))) + geom_boxplot() 

enter image description here

Aber ich bin nicht wirklich sicher, wie das zu beheben .. Irgendwelche Gedanken?

Antwort

3

Ich bin mir nicht sicher, warum ggplot nicht wirklich die Alpha-Ebenen in der Legende für Boxplots bietet, aber Sie können es hart codieren mit override.aes. (Anmerkung der Redaktion: Ich finde die Alpha-Ästhetik für den Boxplot oder das Balkenplot etwas verwirrend. Es ist schwer, die Transparenz mental von der Füllfarbe zu trennen, und die Graustufen-Alpha-Legende verschärft das Problem, da nichts in Grau abgebildet wird die Handlung.)

In dem folgenden Code, um die Sichtbarkeit der Legende zu verbessern, habe ich die Box-Zeilen aus der alpha Legende entfernt und die Legendenschlüsselhöhe erhöht. Ich habe auch die Ästhetik bearbeitet, um das Argument group zu beseitigen.

ggplot(dt, aes(x=factor(x), y=y, fill=tag1, alpha=tag2)) + 
    geom_boxplot() + 
    scale_alpha_manual(values=c(0.2,0.7)) + 
    guides(alpha=guide_legend(override.aes=list(fill=hcl(c(15,195),100,0,alpha=c(0.2,0.7)), 
               colour=NA))) + 
    theme(legend.key.height=unit(1,"cm")) 

enter image description here

wäre eine weitere Option sein interaction sowohl die Füllung und Alpha-Ästhetik zu verwenden, aber es stellt sich heraus, ggplot schließt keine Farben in diesem Fall:

ggplot(dt, aes(x=factor(x), y=y, alpha=interaction(tag1,tag2)), 
     fill=interaction(tag1,tag2)) + 
    geom_boxplot() + 
    scale_fill_manual(values=rep(hcl(c(15,195),100,65), 2)) + 
    scale_alpha_manual(values=rep(c(0.3, 1), each=2)) + 
    theme(legend.key.height=unit(2,"cm")) 

enter image description here

Also, stattdessen können Sie alles mit der Füllung Ästhetik tun, aber Transparenz in der Farbspezifikation enthalten. Das funktioniert, aber wieder einmal, weil Transparenz und Farbe in der visuellen Wahrnehmung etwas vermischt sind, ist es wahrscheinlich besser, nur mit vier verschiedenen Farben zu gehen.

ggplot(dt, aes(x=factor(x), y=y, fill=interaction(tag1,tag2,sep="-"))) + 
    geom_boxplot() + 
    scale_fill_manual(values=hcl(c(15,195,15,195),100,65, alpha=c(0.4,0.4,1,1))) + 
    theme(legend.key.height=unit(1,"cm")) + 
    labs(fill="Tag 1 - Tag 2") 

enter image description here

+0

Dank! Es ist seltsam, dass es zwischen Bar und Boxplot ein unterschiedliches Verhalten gibt, und dass es so manuell korrigiert werden muss, aber das funktioniert definitiv! Ich stimme zu, dass das Alpha in diesem Beispiel verwirrend ist. In meinem Endergebnis verwende ich Alpha, um zwischen dem theoretischen Ergebnis (transparent) und dem unordentlicheren Ergebnis zu unterscheiden, das man aufgrund von Stichprobenfehlern usw. erhält. Also denke ich, dass es besser lesbar ist. – benjamin

Verwandte Themen