Questa soluzione sarà piuttosto lunga. Il problema è che con position="jitter"
non è possibile ottenere le coordinate esatte per i punti, quindi è necessario trovare una soluzione alternativa.
Quindi prendi la tua trama originale e salvala con ggplot_build()
. Il primo elemento di dati contiene informazioni sui boxplot. Siamo interessati alla colonna group
e outliers
in quanto mostra quali valori ggplot assume come valori anomali. Salvali come oggetto separato.
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
Ora cambia group
valori a 4,6 e 8 per essere lo stesso cyl
valori.
xx$group<-c(4,6,8)
Unire questo nuovo frame di dati con l'originale mtcars
e salvare come nuova cornice di dati. Quindi applicare la funzione per verificare se il valore di è elencato in outliers
per il livello cyl
. Tali valori (TRUE e FALSE) vengono salvati nella colonna 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)
Utilizzare un nuovo riquadro dati per stampare i dati. Rimuovi i valori anomali dal modulo geom_boxplot()
. Utilizzare la colonna out
per determinare la forma e la dimensione dei punti. Con scale_shape_manual()
e scale_size_manual()
regolare l'aspetto.
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")