2013-03-10 2 views
23

ggplot(dat, aes(x=Var1, y=Var2)) 대신 ggplot(dat, aes(x=dat[,1], y=dat[,2]))과 같은 것이 필요합니다. 즉, 주소 대신 변수 이름을 사용하여 산점도를 그려야합니다. (나는 '무언가'라고 말합니다. 왜냐하면 후자가 효과가 없기 때문입니다).변수 번호로 x와 y를 주소 지정

여기 내 코드입니다 :

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 

답변

13

벡터를 aes (@ Arun의 답변)으로 전달하는 대신 을 사용하는 것이 좋습니다. 조금 더 복잡해 보일 수도 있지만 예를 들어 다음과 같은 경우 더 유연합니다. 데이터를 업데이트합니다.aes_q()이 SE 버전과 일치하도록 aes_()로 대체되었습니다으로 ggplot2의 V2.0.0의 :

# 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("a-b", "c-d", "e-f", "g-h", "i-j") 
testdata2 <- data.frame(v1=rnorm(100), v2=rnorm(100), v3=rnorm(100), v4=rnorm(100), v5=rnorm(100)) 
names(testdata2) <- c("a-b", "c-d", "e-f", "g-h", "i-j") 

# works 
showplot1(indata=testdata, inx=2, iny=3) 
# this update works in the aes_q version 
showplot1(indata=testdata, inx=2, iny=3) %+% testdata2 

참고 :

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) 
} 

그리고 여기는 것이 바람직하다 왜 이유 다른 패키지의 NSE 기능

+0

사실, 솔루션이 더 유연 해 보이며 정확한 축 제목을 만드는 것도 좋습니다 ... 감사합니다! –

+5

ggplot2 v2.0.0부터 : 다른 패키지의 NSE 기능의 SE 버전과 일치하도록 aes_q()가 aes_()로 대체되었습니다. https://github.com/hadley/ggplot2/blob/master/NEWS.md# 더 이상 사용되지 않는 기능 – Tung

12

시도 :

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 사용이 인수를 인용, 이름이 숫자를 사용하여 가져옵니다.

+0

죄송합니다. @alexwhan, 나에게 분명하지 않습니다. 조금 더 설명해 주시겠습니까? 감사! –

+0

첫 번째 버전은 실제로 귀하의 질문에 대답하지 않았습니다. 편집을 시도하십시오 – alexwhan

+0

예, 이것이 완벽하게 작동합니다. 고마워요! –

0

임시 해결책 나는 순간을 발견

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에서 다른 열을 필요로하고 여기에 내가 명시 적으로 그들 모두를 정의해야합니다 in dat<- ...

20

aes은 사용자의 기능 환경을 알지 못하며 global environment 만 보입니다.

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() : 당신이 명시 적으로을 통과하지 않는 한 따라서, 함수 내에서 선언 된 변수 dat보이지ggplot2aes 기능 입니다. 이제는 효과가있다.

+0

예, 범위의 문제라고 의심했습니다. 이제는 분명합니다. 나는이 솔루션을 더 좋아합니다. 감사! –

관련 문제