通过variables编号来寻址x和y

我需要绘制一个散点图,用列号而不是名称来寻址variables,即代替ggplot(dat, aes(x=Var1, y=Var2))我需要像ggplot(dat, aes(x=dat[,1], y=dat[,2])) 。 (我说“某事”,因为后者不起作用)。

这是我的代码:

 showplot1<-function(indata, inx, iny){ dat<-indata print(nrow(dat)); # this is just to show that object 'dat' is defined p <- ggplot(dat, aes(x=dat[,inx], y=dat[,iny])) p + geom_point(size=4, alpha = 0.5) } testdata<-data.frame(v1=rnorm(100), v2=rnorm(100), v3=rnorm(100), v4=rnorm(100), v5=rnorm(100)) showplot1(indata=testdata, inx=2, iny=3) 
 # Error in eval(expr, envir, enclos) : object 'dat' not found 

我强烈build议使用aes_q而不是将向量传递给aes (@ Arun的答案)。 它可能看起来更复杂一些,但是当更新数据时更加灵活。

 showplot1 <- function(indata, inx, iny){ p <- ggplot(indata, aes_q(x = as.name(names(indata)[inx]), y = as.name(names(indata)[iny]))) p + geom_point(size=4, alpha = 0.5) } 

这就是为什么它是优选的原因:

 # test data (using non-standard names) testdata<-data.frame(v1=rnorm(100), v2=rnorm(100), v3=rnorm(100), v4=rnorm(100), v5=rnorm(100)) names(testdata) <- c("ab", "cd", "ef", "gh", "ij") testdata2 <- data.frame(v1=rnorm(100), v2=rnorm(100), v3=rnorm(100), v4=rnorm(100), v5=rnorm(100)) names(testdata2) <- c("ab", "cd", "ef", "gh", "ij") # works showplot1(indata=testdata, inx=2, iny=3) # this update works in the aes_q version showplot1(indata=testdata, inx=2, iny=3) %+% testdata2 

注:ggplot2 v2.0.0开始, aes_q()已被replace为aes_() ,以与其他软件包中SE版本的NSE函数保持一致。

你的问题是, aes不知道你的函数的环境,它只看到global environment 。 所以,在函数内声明的variablesdatggplot2aes函数是不可见的除非你明确地将它传递为:

 showplot1<-function(indata, inx, iny) { dat <- indata p <- ggplot(dat, aes(x=dat[,inx], y=dat[,iny]), environment = environment()) p <- p + geom_point(size=4, alpha = 0.5) print(p) } 

请注意ggplot()命令中的参数environment = environment() 。 它应该现在工作。

尝试:

 showplot1 <- function(indata, inx, iny) { x <- names(indata)[inx] y <- names(indata)[iny] p <- ggplot(indata, aes_string(x = x, y = y)) p + geom_point(size=4, alpha = 0.5) } 

编辑以显示发生了什么 – aes_string使用引用的参数,名称使用您的数字获取它们。

我暂时find的临时解决办法是:

 showplot1<-function(indata, inx, iny){ dat<-data.frame(myX=indata[,inx], myY=indata[,iny]) print(nrow(dat)); # this is just to show that object 'dat' is defined p <- ggplot(dat, aes(x=myX, y=myY)) p + geom_point(size=4, alpha = 0.5) } 

但我不喜欢它,因为在我真正的代码中,我需要indata其他列,在这里,我将不得不明确地定义所有这些在dat<-