2013-07-24 16 views
16

Giả sử tôi muốn vẽ biểu đồ với công thức sau đây (tôi biết nó không phải là tốt nhất nhưng nó sẽ minh họa cho vấn đề):Cách sử dụng các biến được khai báo trước đó trong aes trong ggplot với các toán tử đặc biệt (..count .., v.v.)

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

Nó hoạt động tốt. Tuy nhiên, chúng ta hãy nói rằng chúng tôi muốn cho một số lý do tần số chia cho một số xác định earler. bắn của tôi sẽ là:

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

Tuy nhiên tôi nhận được lỗi này gây phiền nhiễu:

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

Liệu có tồn tại một cách để sử dụng cả hai ..count.. -like biến với một số những người được xác định trước?

Trả lời

30

Dường như có một số lỗi với chức năng ggplot() khi bạn sử dụng một số stat để vẽ đồ thị (ví dụ: y=..count..). Hàm ggplot() đã có biến số environment và do đó nó có thể sử dụng biến được định nghĩa bên ngoài hàm này.

Ví dụ này sẽ làm việc vì k chỉ được sử dụng để thay đổi x biến:

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

này sẽ đưa ra một lỗi vì k được sử dụng để thay đổi y được tính toán với stat y=..count..

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

Để giải quyết vấn đề này, bạn có thể kefine k bên trong aes().

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

@DidzisElferts Điều đó sẽ không bao giờ xảy ra với tôi. Tôi đã sẵn sàng để gửi một câu trả lời bằng cách sử dụng 'get'. – Roland

+1

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

+0

Tôi nghĩ rằng có một lỗi phải trung thực; ggplot() có tham số 'environment', nhưng có vẻ như bị bỏ qua khi các biến stat được sử dụng – baptiste