通过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
。 所以,在函数内声明的variablesdat
对ggplot2
的aes
函数是不可见的 , 除非你明确地将它传递为:
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<-
…