2010-10-21 33 views
18

Tôi có một ô mẫu hiển thị nhiều hộp. Tôi muốn kết nối trung bình cho mỗi hộp cùng với một dòng. Khung hình không hiển thị giá trị trung bình theo mặc định, thay vào đó đường giữa chỉ cho biết trung vị. Tôi đã thửTham gia phương tiện trên một ô vuông với một đường thẳng (ggplot2)

ggplot(data, aes(x=xData, y=yData, group=g)) 
    + geom_boxplot() 
    + stat_summary(fun.y=mean, geom="line") 

Điều này không có tác dụng.

Điều thú vị đủ, làm

stat_summary(fun.y=mean, geom="point") 

rút ra điểm trung bình trong mỗi hộp. Tại sao "dòng" không hoạt động?

Something như thế này nhưng sử dụng ggplot2, http://www.aliquote.org/articles/tech/RMB/c4_sols/plot45.png

+1

nếu có ai có thể cho biết lý do cho nhóm = 1 trong dung dịch Bernd, nó sẽ là tuyệt vời. – nixbox

+0

Đoán của tôi là nhóm thẩm mỹ nhóm = 1 bị vô hiệu hóa, bởi vì nếu nó được kích hoạt, thì các dòng được vẽ riêng cho mỗi nhóm, trong trường hợp trung bình sẽ là một điểm, do đó sẽ không có đường vẽ. – nixbox

+0

Vâng, tôi nghĩ bạn đúng. Tôi tìm thấy một lời giải thích tốt trong cuốn sách của Hadley Wickham và cập nhật câu trả lời của tôi. –

Trả lời

27

Là những gì bạn đang tìm kiếm?

library(ggplot2) 

x <- factor(rep(1:10, 100)) 
y <- rnorm(1000) 
df <- data.frame(x=x, y=y) 

ggplot(df, aes(x=x, y=y)) + 
geom_boxplot() + 
stat_summary(fun.y=mean, geom="line", aes(group=1)) + 
stat_summary(fun.y=mean, geom="point") 

Cập nhật:

Một số giải thích về việc thiết group = 1: Tôi nghĩ rằng tôi tìm thấy một lời giải thích trong cuốn sách "ggplot2: Elegant Graphics for Data Analysis" Hadley Wickham. Ở trang 51, anh viết:

Các nhóm khác nhau trên các lớp khác nhau.

Thỉnh thoảng, chúng tôi muốn tóm tắt tóm tắt dựa trên các cấp độ khác nhau của tổng hợp. Các lớp khác nhau có thể có tính thẩm mỹ nhóm khác nhau, do đó, rằng một số mức hiển thị riêng lẻ dữ liệu trong khi những người khác hiển thị tóm tắt của các nhóm lớn hơn.

Dựa trên ví dụ trước, giả sử chúng ta muốn thêm một mịn dòng duy nhất để cốt truyện vừa tạo ra, dựa trên độ tuổi và chiều cao của tất cả các chàng trai . Nếu chúng tôi sử dụng cùng một nhóm cho độ mịn mà chúng tôi đã sử dụng cho đường kẻ, chúng tôi sẽ có được âm mưu đầu tiên trong Hình 4.4.

p + geom_smooth (aes (group = Chủ đề), method = "lm", se = F)

Đây không phải là những gì chúng tôi muốn; chúng tôi có vô tình thêm dòng được làm mịn cho mỗi cậu bé. Lớp mới này cần thẩm mỹ nhóm khác nhau, nhóm = 1, để dòng mới sẽ dựa trên tất cả dữ liệu, như được hiển thị trong ô thứ hai trong hình. Lớp sửa đổi trông như thế này:

p + geom_smooth (aes (group = 1), method = "lm", size = 2, se = F)

[...] Sử dụng aes (group = 1) trong lớp mịn phù hợp với một dòng phù hợp nhất trên tất cả các chàng trai."

+2

có !, cảm ơn, nhưng nhóm = 1 có ý nghĩa gì ở đây? – nixbox

+0

Äh, tôi biết câu hỏi đó sẽ đến :-) Xin lỗi nhưng tôi phải thừa nhận rằng tôi không biết. Một vài tuần trước, tôi đã có một vấn đề tương tự và thấy rằng giải pháp một nơi nào đó làm việc cho tôi. –

+0

haha, cảm ơn anyways :) – nixbox

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