2013-12-18 19 views
6

データ行列の複数の列を1つの列に対してプロットしたいので、各列を個別にプロットするのではなく、ループを使用しています。問題は、ループを使用する場合、プロットする列名と色を可変にする必要があることです。変数をaes_stringに渡す

allDs <- sort(unique(plotdata$D)) 
p <- ggplot(plotdata, aes(SpaceWidth)) 
for (thisD in allDs) { 
    tlColName <- paste("M2D", thisD, "Tl", sep="") 
    colorName <- paste("D", thisD, sep="") 
    p <- p + geom_line(data = plotdata[!is.na(plotdata[[tlColName]]),], aes_string(y = tlColName, color = colorName)) 
} 
p <- p + scale_colour_manual("Legend", values = c("D2" = "blue", "D3" = "red", "D4" = "green", "D6" = "violet", "D7" = "yellow")) 
p <- p + scale_x_log10(breaks = composite$SpaceWidth) 
p <- p + facet_wrap(~ Drawn, ncol = 3) 
p <- p + labs(title = "Fu plot", y = "MTN") 
p 

しかし、私はこれを実行すると、私は次のエラーを取得する:私は、次のことを試してみました

色(または他の値)がaes_stringに変数として渡すことができますどのように
Error in eval(expr, envir, enclos) : object 'D2' not found 

?前もって感謝します。

データはhereです。

+1

データのサンプルも提供できますか? 'dput(head(plotData、100))'を使って試してみて、その出力をあなたの質問に貼り付けてください。 –

+0

FYI - エラーは、 'D2'列が実際に' plotdata'データフレームに存在しないことを意味します。つまり、forループを使用せずに、求めているものを達成する別の(より良い)方法がありそうです。 –

+0

しかし問題は私が渡している "色"の値であるようです。 aes_stringから色を削除すると、プロットが機能します。とにかく、これをより良く、適切な方法で行う方法を私に教えることができれば、非常に役に立ちます。 – Dronacharya

答えて

3

エラーの理由はわかりやすいです。元のデータセットにD2が存在しません。変数Dに色を直接マッピングすることができるので、colorNameの構築は冗長です。これをチェックしてください:

allDs <- sort(unique(plotdata$D)) 
plotdata$D <- as.factor(plotdata$D) 
p <- ggplot(plotdata, aes(SpaceWidth, color=D)) 
for (thisD in allDs) { 
    tlColName <- paste("M2D", thisD, "Tl", sep="") 
    p <- p + geom_line(data = plotdata[!is.na(plotdata[[tlColName]]),], 
      aes_string(y = tlColName)) 
} 
p <- p + scale_colour_manual("Legend", 
     values = c("blue", "red", "green", "violet", "yellow")) 
p <- p + scale_x_log10(breaks = plotdata$SpaceWidth) 
p <- p + facet_wrap(~ D, ncol = 3) 
p <- p + labs(title = "Fu plot", y = "MTN") 
p 

色を正しくマップするには、最初に係数に変換する必要があります。 enter image description here

UPD: まあ、私は一般的に良い習慣ではありませんループ、ためを取り除く方法をお見せしましょう。

library(reshape2) 
melt.plotdata <- melt(plotdata, id.vars=c("SpaceWidth", "D")) 
melt.plotdata <- melt.plotdata[order(melt.plotdata$SpaceWidth), ] 
melt.plotdata <- na.omit(melt.plotdata) 
q <- ggplot(melt.plotdata, aes(SpaceWidth, value, colour=variable)) + geom_path() 
q + scale_colour_manual("Legend", 
         values = c("blue", "red", "green", "violet", "yellow")) + 
    scale_x_log10(breaks = melt.plotdata$SpaceWidth) + 
    facet_wrap(~ D, ncol = 3) + 
    labs(title = "Fu plot", y = "MTN") 

プロットは上記のものと同じです。

+0

ありがとう!私はこれを試してみましょう:) – Dronacharya