R ggplot:aes vs aes_字符串,或者如何以编程方式指定列名?

R ggplot:aes vs aes_字符串,或者如何以编程方式指定列名?,r,plot,ggplot2,R,Plot,Ggplot2,假设我们有以下数据帧 data <- data.frame(time=1:10, y1=runif(10), y2=runif(10), y3=runif(10)) 但这不会给出相同的结果,因为现在color不是每行的固定颜色(aes\u string将在数据帧环境中解释f)。因此,图例将成为一个颜色栏,并且不包含不同的列名。我的下一个猜测是混合aes和aes\u string,尝试将颜色设置为固定字符串: p <- p + geom_line(aes_string(y=f), a

假设我们有以下数据帧

data <- data.frame(time=1:10, y1=runif(10), y2=runif(10), y3=runif(10))
但这不会给出相同的结果,因为现在
color
不是每行的固定颜色(
aes\u string
将在数据帧环境中解释
f
)。因此,图例将成为一个颜色栏,并且不包含不同的列名。我的下一个猜测是混合
aes
aes\u string
,尝试将
颜色设置为固定字符串:

p <- p + geom_line(aes_string(y=f), aes(colour=f))
但这会产生
错误:无效的颜色名称“y1”
(我也不想手动选择一些合适的颜色名称)。下一次尝试是仅返回到
aes
,复制手动方法:

p <- p + geom_line(aes(y=data[[f]], colour=f))

p您可以
(感谢您提醒我此功能,rawr)您的所有数据分解成几列。例如,它可以如下所示:

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)
p <- p + geom_line(aes_string(y=f), colour=f)
library(reshape2)    
data2 <- melt(data, id = "time")
head(data2)
#    time variable       value
# 1     1       y1 0.353088575
# 2     2       y1 0.621565368
# 3     3       y1 0.696031085
# 4     4       y1 0.507112969
# 5     5       y1 0.009560710
# 6     6       y1 0.158993988
ggplot(data2, aes(x = time, y = value, color = variable)) + geom_line()
library(重塑2)

数据2注意:这不是一个真正的答案,只是对幕后发生的事情的一个非常片面的解释,可能会让你走上正确的道路。我必须承认,我对NSE的理解仍然很基本

在这个问题上,我一直在努力,现在仍然在努力。我已经把问题缩小到了可以讨论的范围。我不熟悉R的原生替换/引用/评估功能,因此我将演示如何使用
lazyeval

library(lazyeval)

a <- lapply(c(1:9,13), function(i) lazy(i))

head(a)
# [[1]]
# <lazy>
#   expr: c(1, 2, 3, 4, 5, 6, 7, 8, 9, 13)[[10L]]
#   env:  <environment: 0x25889a00>
# 
# [[2]]
# <lazy>
#   expr: c(1, 2, 3, 4, 5, 6, 7, 8, 9, 13)[[10L]]
#   env:  <environment: 0x25889a00>
#
# ...........

lazy_eval(a[[1]])
# [1] 13

lazy_eval(a[[2]])
# [1] 13

这是旧的,但如果其他人遇到它,我有一个非常类似的问题,使我疯狂。我找到的解决方案是使用
as.name()
选项将
aes_q()
传递到
geom_line()
。您可以在
aes\u q()
上找到详细信息。下面是我解决这个问题的方法,虽然相同的原理应该在一个循环中工作。请注意,我在这里添加了多个带有
geom_line()
的变量作为列表,这样可以更好地概括(包括一个变量)


varnames融化数据然后打印@rawr:这只是一个示例问题,显示了我对
aes
vs
aes\u string
的一般问题。所以我实际上并不是在寻找一种避免for循环的方法。我的目标是理解如何编写这样一个循环。但它也没有实现与展开循环的完全等效(没有图例,手动使用palette()似乎会导致不同的颜色)。这显然是可以解决的,我的目标是学习一些关于非标准评估的知识:给定一个展开的循环,如何在实际循环中产生完全相同的行为?我希望有可能对NSE“隐藏”上一个示例中的表达式。我认为这本质上就是rawr建议的
melt
。请注意,
melt(…)
reforme2
包中。这是惯用的方法:
library(reforme2);谢谢!对于这个特殊的问题,这是一个非常好的解决方法。然而,在不同的情况下,我遇到了这种“混合使用
aes
aes\u string
”的问题,在这种情况下,熔化不一定适用。因此,我仍然在寻找一个解决方案来编写这个简单的for循环。
library(reshape2)    
data2 <- melt(data, id = "time")
head(data2)
#    time variable       value
# 1     1       y1 0.353088575
# 2     2       y1 0.621565368
# 3     3       y1 0.696031085
# 4     4       y1 0.507112969
# 5     5       y1 0.009560710
# 6     6       y1 0.158993988
ggplot(data2, aes(x = time, y = value, color = variable)) + geom_line()
library(lazyeval)

a <- lapply(c(1:9,13), function(i) lazy(i))

head(a)
# [[1]]
# <lazy>
#   expr: c(1, 2, 3, 4, 5, 6, 7, 8, 9, 13)[[10L]]
#   env:  <environment: 0x25889a00>
# 
# [[2]]
# <lazy>
#   expr: c(1, 2, 3, 4, 5, 6, 7, 8, 9, 13)[[10L]]
#   env:  <environment: 0x25889a00>
#
# ...........

lazy_eval(a[[1]])
# [1] 13

lazy_eval(a[[2]])
# [1] 13
ggplot2:::`+.gg`
ggplot2:::aes
ggplot2:::aes_q
ggplot2:::aes_string
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)