2016-08-15 7 views
2

Ich bin ein Neuling zu R/ggplot, und ich habe StackOverflow für similar problems befragt, vergeblich. Es ist wahrscheinlich ein triviales Problem für die ggplot-Experten im Haus, wenn ja, freue ich mich auf eine schnelle Antwort!ggplot legende Reihenfolge nicht übereinstimmen

Also hier geht: Ich versuche, 4 Kurven aus Variablen in einem Datenrahmen, Playng mit Farbe und Linientyp zu plotten. Leider sind die Legendenbeschriftungen zu den Kurven nicht passend, was den ganzen Zweck einer Legende vereitelt. Hier

ist die Figur: 4 curves with mismatched labels

Und hier ist der Code, den es erzeugt:

# declare variables 
alpha = 0.5 
m = 500 
x = seq(m) 
fdr_thresh = x/m*alpha 
lvl_thresh = rep(alpha,m) 
pvals = sin(2*pi*x/20) 
pvalsA = exp(-x/100)*cos(2*pi*x/20) 

# plot 
df <- data.frame(pvals=pvals, pvalsA = pvalsA, FDR = fdr_thresh, level = lvl_thresh, x=x) 
p4 <- ggplot(data = df) + geom_line(aes(x=x, y=pvals,color="Pure Sinusoid",linetype="Pure Sinusoid")) 
p4 <- p4 + geom_line(aes(x=x, y=pvalsA,color="Damped Sinusoid",linetype="Damped Sinusoid")) 
p4 <- p4 + geom_line(aes(x=x, y=FDR,color = 'FDR', linetype='FDR')) 
p4 <- p4 + geom_line(aes(x=x, y=level,color='alpha',linetype='alpha')) 
p4 = p4+ scale_linetype_manual(name = "Significance", values=c("Pure Sinusoid"= 1,"Damped Sinusoid" = 1,"FDR" = 2,"alpha" = 3),labels=c("Pure Sinusoid", "Damped Sinusoid", "Sloping line",bquote(alpha == .(alpha)))) 
p4 = p4 + scale_color_manual(name = "Significance",values=c("Pure Sinusoid"= "Chocolate1","Damped Sinusoid" = 'Chartreuse4',"FDR" = "black","alpha" = "black") , labels=c("Pure Sinusoid", "Damped Sinusoid", "Sloping line",bquote(alpha == .(alpha)))) 
p4 <- p4 + theme(legend.position = c(0.7, 0.8),legend.title=element_blank(),legend.key = element_rect(fill = "transparent",colour = "transparent"),legend.background = element_rect(fill=alpha('white', 0.8))) 
show(p4) 

Ich wäre Ihnen sehr dankbar für einen Tipp, wie man dies besser zu tun. Die gleiche Handlung in Matlab oder Python wäre korrekt und hätte 15 Minuten gedauert, also muss ich irgendwo eine falsche Entscheidung getroffen haben. (und nein, die Wahl von R war nicht diese Entscheidung: das ist Teil meiner Bemühungen, es zu lernen)

+0

, was Sie von nicht übereinstimmen bedeuten kann, was die richtige Anpassung wäre? R ordnet Ihre ästhetischen Variablen der Legende zu. Wenn Sie also nichts Falsches zugewiesen haben, sollte es keine "Diskrepanz" geben. –

+0

Entschuldigung, ich fand das selbsterklärend. die Legende sagt "Reine Sinuskurve" für die schwarze punktierte Kurve, die "Alpha = 0.5" entspricht, und umgekehrt (die orangefarbene Kurve sollte mit "Reine Sinuskurve" beschriftet sein, stattdessen mit "Alpha = 0.5") –

Antwort

4

Der "richtige Weg", dies zu tun ist, um Ihre Daten in einen langen Datenrahmen zu schmelzen und lassen Sie dann ggplot kümmern die mehrere Zeilen für Sie von der grafischen Darstellung, anstatt die Ausgabe getrennte geom_line() Anrufe ...

# plot 
df <- data.frame(pvals, pvalsA, FDR = fdr_thresh, level = lvl_thresh, x) 

mm <- reshape2::melt(df,id.var="x") 
my.labs <- c("Pure Sinusoid","Damped Sinusoid","Sloping line", 
      bquote(alpha==.(alpha))) 
p4 <- ggplot(data = mm, aes(x,value,colour=variable,linetype=variable)) + 
    geom_line() 
p4 <- p4 + scale_linetype_manual(name="Significance",values=c(1,1,2,3), 
      labels=my.labs) 
p4 <- p4 + scale_color_manual(name = "Significance", 
        values=c("Chocolate1",'Chartreuse4',"black","black"), 
        labels=my.labs) 
p4 <- p4 + theme(legend.position = c(0.7, 0.8), 
        legend.title=element_blank(), 
        legend.key = element_rect(fill = "transparent", 
              colour = "transparent"), 
      legend.background = element_rect(fill=alpha('white', 0.8))) 
show(p4) 

enter image description here

(ich hatte schon theme_bw() Satz in der R-Sitzung I in funktionierte, weshalb der graue Hintergrund ist/Gitterlinien fehlen ...)

+2

... seufzen Ich wünschte, es gäbe einen Weg zu sehen, ob jemand anders an einer Antwort arbeitet. Ich war ungefähr eine Minute davon entfernt zu sein. Schön erklärt, wie immer! – Gregor

+0

"intuitiv" ist im Auge/Gehirn des Betrachters. ggplot braucht etwas Gewöhnung an/Paradigmenwechsel. Nicht jeder mag es (tue ich). –

1

Das Problem ist, dass Sie die falsche Reihenfolge hinzugefügt haben, als Sie Ihre Variablenbeschriftungen zugeordnet haben.

dp4 <- ggplot(data = df) + geom_line(aes(x=x, y=pvals,color="Pure Sinusoid",linetype="Pure Sinusoid")) 
p4 <- p4 + geom_line(aes(x=x, y=pvalsA,color="Damped Sinusoid",linetype="Damped Sinusoid")) 
p4 <- p4 + geom_line(aes(x=x, y=FDR,color = 'FDR', linetype='FDR')) 
p4 <- p4 + geom_line(aes(x=x, y=level,color='alpha',linetype='alpha')) 

p4 <- p4+ scale_linetype_manual(name = "Significance", values=c("Pure Sinusoid"= 1,"Damped Sinusoid" = 1,"FDR" = 2,"alpha" = 3),labels=c(bquote(alpha == .(alpha)), "Damped Sinusoid", "Sloping line","Pure Sinusoid")) 

p4 <- p4 + scale_color_manual(name = "Significance",values=c("Pure Sinusoid"= "Chocolate1","Damped Sinusoid" = 'Chartreuse4',"FDR" = "black","alpha" = "black") , labels=c(bquote(alpha == .(alpha)), "Damped Sinusoid", "Sloping line","Pure Sinusoid")) 

p4 <- p4 + theme(legend.position = c(0.7, 0.8),legend.title=element_blank(),legend.key = element_rect(fill = "transparent",colour = "transparent"),legend.background = element_rect(fill=alpha('white', 0.8))) 
show(p4) 

enter image description here

+1

Nein sollten sie nicht ... sie ordnen sich entsprechend der Reihenfolge in der Faktorvariablen ab - Sie können die Reihenfolge ändern, wenn Sie möchten. ggplot2 folgt der Grammatik der Grafiklogik - z. geschichtete Grafiken. Die Schichten sind voneinander unabhängig. –

+1

Die Zeichenreihenfolge sollte nichts mit der Etikettenreihenfolge zu tun haben! Die Zeichenreihenfolge ändert, was oben ist - welcher Vordergrund der Hintergrund ist. Die Reihenfolge der Labels wird durch die Reihenfolge festgelegt, die Ihren Daten innewohnt (standardmäßig wird die alphabetische Reihenfolge verwendet, es sei denn, Sie geben etwas anderes an). – Gregor

+0

Ich sehe eine Begründung dafür. Ich hätte gedacht, dass die Reihenfolge der Etiketten mit der Reihenfolge der Spalten im Datenrahmen übereinstimmen würde; Sagst du mir, dass dieser Befehl illusorisch ist? Was ist der einfachste Weg, um eine Bestellung anzugeben? –