gpt4 book ai didi

r - ggplot : aes vs aes_string,或如何以编程方式指定列名称?

转载 作者:行者123 更新时间:2023-12-04 04:05:11 24 4
gpt4 key购买 nike

假设我们有以下数据框

data <- data.frame(time=1:10, y1=runif(10), y2=runif(10), y3=runif(10))

我们想创建一个像这样的图:
p <- ggplot(data, aes(x=time))
p <- p + geom_line(aes(y=y1, colour="y1"))
p <- p + geom_line(aes(y=y2, colour="y2"))
p <- p + geom_line(aes(y=y3, colour="y3"))
plot(p)

但是,如果我们有更多的“y”列,而我们不知道它们的确切名称,该怎么办。这就提出了一个问题:我们如何以编程方式遍历所有列,并将它们添加到绘图中?基本上目标是:
otherFeatures <- names(data)[-1]
for (f in otherFeatures) {
# what goes here?
}

尝试失败

到目前为止,我发现了许多行不通的方法。例如(以下所有示例仅显示上述for循环中的代码行):

我的第一次尝试是简单地使用 aes_string而不是 aes,以便通过循环变量 f指定列名:
p <- p + geom_line(aes_string(y=f, colour=f))

但这不会给出相同的结果,因为现在 colour将不是每行的固定颜色( aes_string将在数据帧环境中解释 f)。结果,图例将变成一个颜色条,并且不包含不同的列名。我的下一个猜测是混合 aesaes_string,尝试将 colour设置为固定字符串:
p <- p + geom_line(aes_string(y=f), aes(colour=f))

但这导致 Error: ggplot2 doesn't know how to deal with data of class uneval。我的下一个尝试是“绝对”使用 colour(不在 aes内),如下所示:
p <- p + geom_line(aes_string(y=f), colour=f)

但这给出了 Error: invalid color name 'y1'(我也不想手动选择一些正确的颜色名称)。下一个尝试是仅返回 aes,复制手动方法:
p <- p + geom_line(aes(y=data[[f]], colour=f))

这不会产生错误,而只会绘制最后一列。这是有道理的,因为 aes可能会调用 substitute,并且表达式将始终使用循环中 f的最后一个值进行计算(在调用 rm f之前的 plot(p)会给出错误,指示求值发生在循环之后)。

重述问题:在for循环中从上方复制简单代码时,需要哪种 substitute/ eval/ quote魔术?

最佳答案

现在已经很老了,但是如果有人碰到它,我有一个非常相似的问题使我发疯。我发现的解决方案是使用aes_q()选项将geom_line()传递给as.name()。您可以找到有关aes_q() here的详细信息。以下是我解决此问题的方法,尽管同一原理应循环工作。请注意,我在此处添加了多个带有geom_line()的变量作为列表,其泛化效果更好(包括一个变量)。

varnames <- c("y1", "y2", "y3")
add_lines <- lapply(varnames, function(i) geom_line(aes_q(y = as.name(i), colour = i)))

p <- ggplot(data, aes(x = time))
p <- p + add_lines
plot(p)

希望对您有所帮助!

关于r - ggplot : aes vs aes_string,或如何以编程方式指定列名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26896275/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com