R ggplot2 aes参数

4

我有一个函数:

vis = function(df, x){
p1 <- ggplot(df, aes(x)) + geom_line(aes(y = v2))
p1
}

I have a data frame:

df = data.frame(v0 = c(1,2,3), v1 = c(2,3,4), v2 = c(3,4,5))

我希望生成图表:(1) v2 与 v0 的对比,(2) v2 与 v1 的对比。

于是我尝试了以下方法:

vis(df, v0) // not work
vis(df, v1) // not work
vis(df, "v0") // not work
vis(df, "v1") // not work

非常感谢,有什么想法吗!
3个回答

5

另一种方法是使用quo_nameaes_string,这不需要ggplot2的开发版:

library(ggplot2)
library(rlang)

vis = function(df, x){
  x <- enquo(x)
  ggplot(df, aes_string(quo_name(x))) + geom_line(aes(y = v2))
}

vis(df, v0)

enter image description here


4

如果我们传递的是未加引号的字符串,则将其转换为quosure,然后进行评估(!!

library(rlang)
library(ggplot2)#devel version

vis = function(df, x){
    x <- enquo(x)
    p1 <- ggplot(df, aes(!!x)) + 
                      geom_line(aes(y = v2))
    p1
}

如果我们以字符串的形式传递x,则将aes替换为aes_string


1
@Hanbo,!! 也应该可以工作。你可能需要 ggplot2 的开发版本。 - akrun
当我传递未引用的变量 vis(df, v1) 时,出现了错误 in !x : invalid argument type。你有什么想法吗?谢谢! - Hanbo
@Hanbo 这已经在开发版本中实现了。你有开发版本吗? - akrun
1
"!!" 可以在我使用的 ggplot2 开发版本中正常工作。非常感谢! - Hanbo

-1

您可以使用列的名称:

df = data.frame(v0 = c(1,2,3), v1 = c(2,3,4), v2 = c(3,4,5))

vis = function(df, x){
  p1 <- ggplot(df, aes(df[,x])) + 
    geom_line(aes(y = v2))+xlab(x)
  p1
}
vis(df, "v0")

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