2016-08-15 6 views
2

私はR/ggplotの初心者です。私はsimilar problemsのStackOverflowを調査しましたが、役に立たないです。それはおそらく家のggplotの専門家のための小さな問題です、もしそうなら、私は素早い答えを楽しみにしています!ggplot legend order mismatch

ここで説明します。データフレームに格納された変数から4つの曲線をプロットしようとしています。色と線種の両方でplayngしています。残念なことに、凡例のラベルは曲線と一致していないため、凡例の目的全体が崩れてしまいます。ここで

は数字です:

# 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) 

私はこれより良いを行う方法の先端のために最も感謝される: 4 curves with mismatched labels

そして、ここではそれを生成されたコードです。 MatlabやPythonの同じプロットは正しいでしょうし、15分かかってしまったので、私はどこかで間違った決定を下したにちがいありません。 (これは私の意思決定の一部ではありません)

+0

あなたは正しいマッチングどうなるか、不一致とはどういう意味ですか? Rはあなたの美的変数を凡例にマッピングするので、何か間違って割り当てていない限り、 "不一致"はありません –

+0

申し訳ありませんが、私はそれが自明であると思いました。凡例には、「Alpha = 0.5」に対応する黒い点線の「純粋な正弦曲線」と、その逆(橙色の曲線は「純粋な正弦曲線」とラベルする必要がありますが、代わりに「Alpha = 0.5」と表示されます) –

答えて

4

"正しい方法"は、データセットを1つの長いデータフレームに溶かしてから、ggplotに注意を払うことです...

enter image description here

# 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) 
をあなたのための複数の行をプロットするのではなく、別の geom_line()呼び出しを発行する(私はすでに、なぜ灰色の背景である、私が働いていたRセッションで theme_bw()セットを持っていました/グリッド線がありません...)

+2

... sigh私は、他の誰かが答えに取り組んでいるかどうかを確認する方法があることを願っています。私はやってから約1分でした。いつものようにうまく説明しました! – Gregor

+0

「直感的」は、見る人の目/脳にあります。 ggplotは/ paradigm-shiftingに慣れています。誰もがそれを好きではない(私は)。 –

1

問題は、変数ラベルをマップしたときに間違った順序を追加したことです。

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

いいえ、そうではありません...要素変数に固有の順序に従ってマッピングされます。必要に応じて順序を変更できます。 ggplot2はグラフィックスロジックの文法に従う。レイヤードグラフィックス。これらの層は互いに独立している。 –

+1

プロットの順序は、ラベルの順序とは関係ありません!プロットの順序は、上にあるものを変更します。これは背景である前景です。ラベルの順序は、データに固有の順序で定義されます(他に何かを指示しない限り、デフォルトはアルファベット順になります)。 – Gregor

+0

私はそれについての理論的根拠を見ます。私は、ラベルの順序がデータフレーム内の列の順序と揃うと考えていたでしょう。この命令は幻想的だと私に伝えていますか?注文を指定する最も簡単な方法は何ですか? –