2013-07-24 15 views
16

Załóżmy, że chcę wydrukować histogram z następującą formułą (wiem, że to nie jest najlepsze, ale zilustruje problem):Jak używać wcześniej zadeklarowanych zmiennych w aes w ggplot z operatorami specjalnymi (..count .., itp.)

set.seed(1) 
dframe <- data.frame(val=rnorm(50)) 
p <- ggplot(dframe, aes(x=val, y=..count..)) 
p + geom_bar() 

Działa dobrze. Powiedzmy jednak, że chcemy z jakiegoś powodu częstotliwości podzielić przez liczbę zdefiniowaną przez Earlera. Mój strzał byłoby:

k <- 5 
p <- ggplot(dframe, aes(x=val, y=..count../k)) 
p + geom_bar() 

Jednak mam ten przykry błąd:

Error in eval(expr, envir, enclos) : object 'k' not found 

Czy istnieje sposób na obiema ..count.. -jak zmienne z kilkoma predefiniowanymi te?

Odpowiedz

30

Wygląda na to, że jest jakiś błąd z funkcją ggplot(), gdy używasz jakiegoś stat do kreślenia (na przykład y=..count..). Funkcja ggplot() ma już zmienną environment i dlatego może używać zmiennej zdefiniowanej poza tą funkcją.

Na przykład to będzie działać, ponieważ k służy tylko do zmiany x zmiennej:

k<-5 
ggplot(dframe,aes(val/k,y=..count..))+geom_bar() 

da to błąd, ponieważ k służy do zmiany y który jest obliczany z stat y=..count..

k<-5 
ggplot(dframe,aes(val,y=..count../k))+geom_bar() 
Error in eval(expr, envir, enclos) : object 'k' not found 

Aby rozwiązać ten problem, można kefine k wewnątrz aes().

k <- 5 
ggplot(dframe,aes(val,k=k,y=..count../k))+geom_bar() 
+1

@DidzisElferts Który nigdy by mi się nie zdarzył. Byłem gotowy opublikować odpowiedź za pomocą 'get'. – Roland

+1

@kuba 'p <- ggplot (dframe, aes (x = val, y = .. count ../ get (" k ", envir = .GlobalEnv)))) – Roland

+0

Myślę, że istnieje błąd, aby być szczerym; ggplot() ma parametr 'environment', ale wydaje się być ignorowany, gdy używane są zmienne statystyczne – baptiste