2013-03-28 17 views
5

Làm cách nào để tạo lớp phủ geom_boxplot một cách hoàn hảo với các geom_points được kích hoạt?Làm cách nào để tôi có thể tạo các ngoại lệ geom_boxplot "xếp hàng" với các geom_points bị jitter?

Ví dụ: tôi muốn các ngoại lệ từ geom_boxplot được hiển thị dưới dạng "sợi ngang" trên các điểm thực tế của chúng từ geom_point sau khi jittering?

library(ggplot2) 
p <- ggplot(mtcars, aes(factor(cyl), mpg)) + 
    geom_boxplot(outlier.shape=10, outlier.size=8) + 
    geom_point(aes(factor(cyl), mpg, color=mpg), position="jitter", size=4) 
p 

plot

Bất kỳ trợ giúp sẽ được đánh giá rất nhiều.

Trả lời

4

Giải pháp này sẽ khá dài. Vấn đề là với position="jitter" bạn không thể có được tọa độ chính xác cho điểm, vì vậy cần phải tìm cách giải quyết.

Vì vậy, hãy lấy lô đất ban đầu của bạn và lưu nó với ggplot_build(). Yếu tố đầu tiên của dữ liệu chứa thông tin về ô. Chúng tôi quan tâm đến cột groupoutliers vì nó hiển thị giá trị ggplot giả định là các ngoại lệ. Lưu chúng dưới dạng đối tượng riêng biệt.

p <- ggplot(mtcars, aes(factor(cyl), mpg)) + 
       geom_boxplot(outlier.shape=10, outlier.size=8) + 
       geom_point(aes(color=mpg), position="jitter", size=4) 
gg<-ggplot_build(p) 
gg$data[[1]] 
    ymin lower middle upper ymax   outliers notchupper notchlower x PANEL group weight ymin_final 
1 21.4 22.80 26.0 30.40 33.9     29.62055 22.37945 1  1  1  1  21.4 
2 17.8 18.65 19.7 21.00 21.4     21.10338 18.29662 2  1  2  1  17.8 
3 13.3 14.40 15.2 16.25 18.7 10.4, 10.4, 19.2 15.98120 14.41880 3  1  3  1  10.4 
    ymax_final xmin xmax 
1  33.9 0.625 1.375 
2  21.4 1.625 2.375 
3  19.2 2.625 3.375 

xx<-gg$data[[1]][c("group","outliers")] 
xx 
    group   outliers 
1  1     
2  2     
3  3 10.4, 10.4, 19.2 

Thay đổi group giá trị thành 4,6 và 8 thành giống với giá trị cyl.

xx$group<-c(4,6,8) 

Bây giờ hợp nhất khung dữ liệu mới này với mtcars gốc và lưu làm khung dữ liệu mới. Sau đó, áp dụng chức năng để kiểm tra xem cụ thể mpg giá trị được liệt kê trong outliers cho mức cyl đó hay không. Các giá trị đó (TRUE và FALSE) được lưu trong cột out.

mtcars.new<-merge(mtcars,xx,by.x="cyl",by.y="group") 
mtcars.new$out<-apply(mtcars.new,1,function(x) x$mpg %in% x$outliers) 

Sử dụng khung dữ liệu mới cho dữ liệu lô. Xóa các ngoại lệ dạng geom_boxplot(). Sử dụng cột out để xác định hình dạng và kích thước điểm. Với scale_shape_manual()scale_size_manual() điều chỉnh giao diện.

ggplot(mtcars.new, aes(factor(cyl), mpg)) + 
      geom_boxplot(outlier.shape = NA) + 
      geom_point(aes(color=mpg,shape=out,size=out), position="jitter")+ 
      scale_shape_manual(values=c(16,10),guide="none")+ 
      scale_size_manual(values=c(4,8),guide="none") 

enter image description here

5

Tôi đồng ý với Didzis rằng một giải pháp mà không chính xác những gì bạn nhắm sẽ là khá tham gia. Để làm theo nghĩa đen những gì bạn đề nghị sẽ yêu cầu (tôi nghĩ) rằng bạn làm cả jittering và tính toán outlier bên ngoài của ggplot. Nếu bạn linh hoạt về cách bạn làm nổi bật các ngoại lệ, đây là giải pháp có khả năng ngắn hơn:

id_outliers <- function(x){ 
    q <- quantile(x,c(0.25,0.75)) 
    iqr <- abs(diff(q)) 
    ifelse((x < q[1] - 1.5*iqr) | (x > q[2] + 1.5*iqr),'Outlier','NotOutlier') 
} 

mtcars <- ddply(mtcars, 
       .(cyl), 
       transform, 
       out = id_outliers(mpg)) 

p <- ggplot(mtcars, aes(factor(cyl), mpg)) + 
    geom_boxplot(outlier.colour = NA) + 
    geom_point(aes(colour = mpg,shape = out),position = "jitter") 
Các vấn đề liên quan