2009-10-29 30 views
13

Tôi đang sử dụng ggplot2 để tạo các bảng biểu đồ và tôi muốn có thể thêm một đường thẳng đứng ở mức trung bình của mỗi nhóm. Nhưng geom_vline() sử dụng đánh chặn tương tự cho mỗi bảng điều khiển (ví dụ: giá trị trung bình toàn cầu):Thêm một đường thẳng đứng với chặn khác nhau cho mỗi bảng trong ggplot2

require("ggplot2") 
# setup some sample data 
N <- 1000 
cat1 <- sample(c("a","b","c"), N, replace=T) 
cat2 <- sample(c("x","y","z"), N, replace=T) 
val <- rnorm(N) + as.numeric(factor(cat1)) + as.numeric(factor(cat2)) 
df <- data.frame(cat1, cat2, val) 

# draws a single histogram with vline at mean 
qplot(val, data=df, geom="histogram", binwidth=0.2) + 
    geom_vline(xintercept=mean(val), color="red") 

# draws panel of histograms with vlines at global mean 
qplot(val, data=df, geom="histogram", binwidth=0.2, facets=cat1~cat2) + 
    geom_vline(xintercept=mean(val), color="red") 

Làm thế nào tôi có thể lấy nó để sử dụng nhóm của mỗi bảng có nghĩa là x-đánh chặn? (Điểm thưởng nếu bạn cũng có thể thêm nhãn văn bản theo dòng có giá trị trung bình.)

Trả lời

9

Một cách là xây dựng data.frame với giá trị trung bình trước khi tay.

library(reshape) 
dfs <- recast(data.frame(cat1, cat2, val), cat1+cat2~variable, fun.aggregate=mean) 
qplot(val, data=df, geom="histogram", binwidth=0.2, facets=cat1~cat2) + geom_vline(data=dfs, aes(xintercept=val), colour="red") + geom_text(data=dfs, aes(x=val+1, y=1, label=round(val,1)), size=4, colour="red") 
13

Tôi đoán đây là bản sửa lại của @ eduardo thực sự, nhưng trong một dòng.

ggplot(df) + geom_histogram(mapping=aes(x=val)) 
    + geom_vline(data=aggregate(df[3], df[c(1,2)], mean), 
     mapping=aes(xintercept=val), color="red") 
    + facet_grid(cat1~cat2) 

alt text http://www.imagechicken.com/uploads/1264782634003683000.png

hoặc sử dụng plyr (require(plyr) một gói bởi tác giả của ggplot, Hadley):

ggplot(df) + geom_histogram(mapping=aes(x=val)) 
    + geom_vline(data=ddply(df, cat1~cat2, numcolwise(mean)), 
     mapping=aes(xintercept=val), color="red") 
    + facet_grid(cat1~cat2) 

Dường như không thỏa mãn mà vline không cắt trên các khía cạnh, tôi m không chắc chắn tại sao.

Các vấn đề liên quan