2013-03-10 11 views
23

Potrzebuję narysować wykres rozrzutu ze zmiennymi adresującymi według ich numerów kolumn zamiast nazw, tj. Zamiast ggplot(dat, aes(x=Var1, y=Var2)) potrzebuję czegoś takiego jak ggplot(dat, aes(x=dat[,1], y=dat[,2])). (Mówię "coś", bo to drugie nie działa).Adresowanie xi y w AES przez numer zmiennej

Oto mój kod:

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 

Odpowiedz

13

Sugeruję użycie aes_q zamiast przekazywania wektorów do aes (@ Arun's answer). Może wyglądać nieco bardziej skomplikowanie, ale jest bardziej elastyczny, gdy np. aktualizowanie danych.

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

A oto powód dlaczego jest korzystne:

# 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 

Uwaga: Od v2.0.0 ggplot2aes_q() został zastąpiony aes_() być zgodne z wersji SE funkcji NSE w innych pakietach.

+0

Rzeczywiście, twoje rozwiązanie wygląda na bardziej elastyczne, podoba mi się też, że tworzy prawidłowe tytuły osi ... Dzięki! –

+5

Począwszy od ggplot2 v2.0.0: aes_q() został zastąpiony przez aes_(), aby był zgodny z wersjami SE funkcji NSE w innych pakietach https://github.com/hadley/ggplot2/blob/master/NEWS.md# przestarzałe funkcje – Tung

12

Spróbuj:

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

Edited by pokazać, co się dzieje - zastosowania aes_string cytowane argumenty, nazwy dostaje je za pomocą numerów.

+0

Przepraszam, Aleale, nie jest dla mnie jasne - czy mógłbyś wyjaśnić trochę więcej? Dzięki! –

+0

Pierwsza wersja nie odpowiedziała na twoje pytanie - spróbuj edytować – alexwhan

+0

tak, działa to idealnie. Dzięki chłopaki! –

0

rozwiązanie tymczasowe znalazłem w tej chwili:

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

Ale ja nie lubię, bo w moim rzeczywisty kod, muszę inne kolumny z indata i tutaj będę musiał określić wszystkie z nich wyraźnie w dat<- ...

20

Twój problem polega na tym, że aes nie zna środowiska twojej funkcji i wygląda tylko w zakresie global environment. Tak, zmienna dat zadeklarowane wewnątrz funkcji jest niewidoczna do ggplot2 „s aes funkcja chyba przekazać go wyraźnie jak:

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

Uwaga argument environment = environment() wewnątrz komendy ggplot(). Teraz powinno działać.

+0

tak, podejrzewałem, że był to problem zakresu, teraz jest jasne i jeszcze bardziej podoba mi się to rozwiązanie. Dzięki! –

Powiązane problemy