2013-12-18 24 views
6

我想繪製一列數據矩陣的幾列,所以不是單獨繪製每列,而是使用一個循環。問題是如果我要使用循環,要繪製的列名和顏色必須是可變的。我試過如下:將顏色作爲變量傳遞給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 

但是當我運行此我得到以下錯誤:

Error in eval(expr, envir, enclos) : object 'D2' not found 

如何顏色(或任何其他數值)作爲aes_string變量傳遞?提前致謝。

測試數據可用here

+1

你能提供你的數據樣本嗎?嘗試使用'dput(head(plotData,100))'並將控制檯的輸出粘貼到你的問題中。 –

+0

僅供參考 - 錯誤意味着「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: 那麼,讓我告訴你如何擺脫的for循環,這是通常不是一個好的做法。

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