将变量列索引传递给ggplot2

73

我试图将列索引作为函数的一部分传递给ggplot,以便我可以反复使用该函数。例如:

myplot <- function(df){
    ggplot(df, aes(df[, 1], df[, 2])) + geom_point()
}

我将始终使用第一列作为我的x变量,第二列作为我的y变量,但是不同的数据集之间列名会改变。我已经到处搜索了...有任何想法吗?

编辑:

这是我使用的答案:

require(ggplot2)

myplot <- function(df){
   ggplot(df, aes_string(colnames(df)[1], colnames(df)[2])) + geom_point()
}

你的问题标题似乎与Paul Hiemstra的答案相对应,该答案涉及使用字符串列名。但是你的问题主体涉及使用它们的索引,这确实是一个重复的标记。我建议将你的问题正文更改为匹配该答案。 - Max Ghenis
@MaxGhenis 两种情况(以及更多)都在 Paul 的答案和下面的评论中得到了回答。 - N8TRO
我明白了。内容不匹配仍会让那些偶然遇到这个问题的人感到困惑;问题应该是具体和明确的。更改它也可以提供一个机会,使其不被标记为重复。 - Max Ghenis
@MaxGhenis 你会建议一个修改后的标题吗? - N8TRO
编辑:忽略下面的内容,我最初误读了。问题应该是“如何将变量列索引传递给ggplot2”,并且已经正确标记为重复。对不起,N8TRO,这只是一个错误的重复标记,可能需要有更多声望的人来请求审核。对此表示抱歉! - Max Ghenis
@MaxGhenis 标题编辑完成。 - N8TRO
1个回答

109
你可以使用 aes_string 代替 aes,以传递字符串而不是对象,例如:
myplot = function(df, x_string, y_string) {
   ggplot(df, aes_string(x = x_string, y = y_string)) + geom_point()
 }
myplot(df, "A", "B")
myplot(df, "B", "A")

12
aes_string(colnames(df)[1], colnames(df)[2]) 可以翻译为 "使用变量名作为字符串来创建 ggplot2 图形的映射,其中 df 是数据框,colnames(df)[1]colnames(df)[2] 分别是该数据框的第一列和第二列的列名。" - baptiste
通常,在ggplot2中,您不会在aes中提供向量。在aes中,您提供绘图美学的映射到数据列,无需在aes中硬编码数据。 - Paul Hiemstra
如果您的列名为a-b,则会出现错误Error in eval(expr, envir, enclos) : object 'a-b' not found。在OP的帖子下面链接中提到的另一种解决方法是使用environment = environment()aes - Arun
5
@PaulHiemstra,我已经提供了一种不使用列名的解决方法。如果你坚持要使用列名,请尝试这个方法:set.seed(45); df <- data.frame(x=gl(5,5), y=runif(25)); myplot2 = function(df, col1, col2) { ggplot(df, aes(x = get(names(df)[col1]), y = get(names(df)[col2])), environment = environment()) + geom_point() }。从这里开始,将此函数更改为接受列名作为参数是非常简单的。 - Arun
@PaulHiemstra,@Arun:使用 aes_q 是将非标准列名传递给 ggplot 的另一种方法。我认为这是更可取的解决方案,请参见此处 - shadow
显示剩余6条评论

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