2009-09-27 24 views
6

Giả sử bạn có các số liệu sau đây:Thêm thống kê tóm tắt (hoặc thậm chí các điểm dữ liệu thô) để boxplots vị trí lẩn tránh

trt <- ifelse(runif(100)<0.5,"drug","placebo") 
inj.site <- ifelse(runif(100)<0.5,"ankle","wrist") 
relief <- 20 + 0.5*(inj.site=="ankle") + 0.5*(trt=="drug") + rnorm(100) 
to.analyze <- data.frame(trt,inj.site,relief) 

Bây giờ, ý tưởng là để thực hiện một boxplot với trang web của chấn thương trên trục x và hộp bằng cách xử lý song song:

bplot <- ggplot(to.analyze,aes(inj.site,relief,fill=trt)) + geom_boxplot(position="dodge") 

Đủ dễ dàng. Nhưng bây giờ tôi muốn thêm các điểm dữ liệu thô ở trên cùng của các hộp. Nếu tôi không có hộp với position="dodge", đây sẽ là dễ dàng:

bplot + geom_point(aes(colour=trt)) 

Tuy nhiên, điều này thu hút điểm ở giữa hộp, và thêm một position="dodge" đến hình học này dường như không làm việc. Làm cách nào để điều chỉnh điều này để các điểm được vẽ trên các hộp?

Phần thưởng: cùng một tình huống với việc sử dụng stat_summary(blah,y.fun=mean,shape="+") để ghi đè lên các phương tiện có cùng vấn đề.

+0

nhẹ nhõm <- 20 + 0,5 * (inj.site == mắt cá chân) + 0,5 * (TRT == "ma túy") + rnorm (100) nên là: nhẹ nhõm <- 20 + 0,5 * (inj.site == "mắt cá chân") + 0,5 * (trt == "thuốc") + rnorm (100) – Paolo

+0

er, vâng, cố định. –

Trả lời

3

Hadley sẽ không nghi ngờ gì chính xác cho tôi nếu tôi sai ở đây ...

Đây là cú pháp tự nhiên:

bplot + geom_point(aes(colour=trt), position=position_dodge(width=.5)) 

(position = "né tránh" sẽ làm điều tương tự, mà không có tham số.)

Khi tôi vẽ nó, tôi nhận được một cái gì đó trông giống như một position_jitter(), có lẽ là những gì bạn nhận được quá.

Tò mò, tôi đã đi tìm trong nguồn, nơi tôi tìm thấy hàm pos_dodge(). (Gõ pos_dodge tại một dấu nhắc R để xem nó ...) Dưới đây là phần cuối của nó:

within(df, { 
    xmin <- xmin + width/n * (seq_len(n) - 1) - diff * (n - 1)/(2 * n) 
    xmax <- xmin + d_width/n 
    x <- (xmin + xmax)/2 
}) 

n là số hàng của khung dữ liệu. Vì vậy, có vẻ như nó né tránh các điểm cá nhân bằng một phần được lập chỉ mục theo hàng! Vì vậy, điểm đầu tiên được dodged chiều rộng/n, thứ hai là dodged 2 * width/n, và cuối cùng là dodged n * width/n.

Điều này rõ ràng không phải là những gì bạn có nghĩa là, mặc dù đó là những gì bạn cho biết. Bạn có thể bị mắc kẹt trong việc tái tạo hộp ô vuông được khắc thủ công, hoặc sử dụng một cách trực quan hóa khác, như là có thể có mặt?

ggplot(to.analyze,aes(inj.site,relief)) + geom_boxplot() + facet_wrap(~ trt) 
+0

Trong faceting, nó hoạt động hoàn hảo. Tuy nhiên, để hình dung lý do tôi muốn có vị trí né tránh nhiều hơn, mặc dù tôi có thể thử faceting trên inj.site? –

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