将颜色作为变量传递给aes_string函数

7
我想将数据矩阵的多列与一列进行绘图,因此我使用循环而不是单独绘制每个列。问题在于,如果我要使用循环,要绘制的列名和颜色必须是可变的。我尝试了以下方法:
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中?谢谢您的帮助。
测试数据可在此处获得: 链接

1
你能提供一下你的数据样本吗?尝试使用 dput(head(plotData,100)) 命令,并将控制台输出粘贴到你的问题中。 - Tommy O'Dell
FYI - 这个错误意味着 plotdata 数据框中实际上不存在 D2 列。话虽如此,很可能有另一种(更好的)方法来实现你所要求的,而不需要使用 for 循环。 - Tommy O'Dell
但问题似乎出在我传递的“color”值上。如果我从aes_string中删除颜色,图表就可以工作。无论如何,如果您能告诉我如何更好地以正确的方式完成这项工作,那将非常有帮助。 - Dronacharya
1个回答

4
错误的原因非常明显:原始数据集中没有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 更新: 好的,让我向您展示如何摆脱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")

剧情将与我上面发布的相同。

谢谢!让我试试这个 :) - Dronacharya

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接