2013-03-10 13 views
23

Ich muss ein Streudiagramm mit Adressvariablen durch ihre Spaltennummern anstelle von Namen, d. H. Anstelle von ggplot(dat, aes(x=Var1, y=Var2)) Ich brauche so etwas wie ggplot(dat, aes(x=dat[,1], y=dat[,2])). (Ich sage 'etwas', weil das letztere nicht funktioniert).Adressierung x und y in aes durch Variablennummer

Hier ist mein Code:

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 

Antwort

13

Ich empfehle dringend aes_q statt Vektoren an aes übergeben (@ Arun's Antwort). Es sieht vielleicht etwas komplizierter aus, aber es ist flexibler, wenn z.B. Aktualisierung der Daten

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

Und hier ist der Grund, warum es vorzuziehen ist:

# 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 

Hinweis: Ab ggplot2 v2.0.0aes_q() hat mit aes_() konsistent zu sein mit SE Versionen ersetzt von NSE-Funktionen in anderen Paketen.

+0

in der Tat, Ihre Lösung sieht flexibler aus, ich mag auch, dass es richtige Achsen Titel macht ... Danke! –

+5

Ab ggplot2 v2.0.0: aes_q() wurde durch aes_() ersetzt, um konsistent mit SE-Versionen von NSE-Funktionen in anderen Paketen zu sein https://github.com/hadley/ggplot2/blob/master/NEWS.md# veraltete Features – Tung

12

Versuchen:

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 zu zeigen, was passiert - aes_string Anwendungen Argumente zitiert, Namen bekommt sie Ihre Zahlen.

+0

sorry @alexwhan, es ist nicht sehr klar für mich - könnten Sie ein bisschen mehr erklären? Vielen Dank! –

+0

Erste Version hat Ihre Frage nicht wirklich beantwortet - versuchen Sie die Bearbeitung – alexwhan

+0

ja, das funktioniert perfekt. Danke Jungs! –

0

provisorische Lösung, die ich für den Augenblick gefunden:

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

Aber ich weiß nicht wirklich wie es denn in meinem realen Code, ich brauche andere Spalten von indata und hier werde ich ausdrücklich alle von ihnen definieren müssen in dat<- ...

20

Ihr Problem ist, dass aes nicht die Umgebung Ihrer Funktion kennt und es nur innerhalb global environment aussieht. So wird die Variable dat in der Funktion deklariert ist nicht sichtbar zu ggplot2 ‚s aes Funktion , wenn Sie es ausdrücklich als übergeben:

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

Hinweis das Argument environment = environment() innerhalb des ggplot() Befehl. Es sollte jetzt funktionieren.

+0

ja, ich vermutete, dass es das Problem des Umfangs war, jetzt ist es klar, und ich mag diese Lösung noch mehr. Vielen Dank! –

Verwandte Themen