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 group
và outliers
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()
và 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")