Điều này có làm những gì bạn muốn không? Nó đòi hỏi một số xử lý dữ liệu và bản vẽ của hai violin.
set.seed(1)
dat <- data.frame(x=1, y=rnorm(10^5))
#calculate for each point if it's central or not
dat_q <- quantile(dat$y, probs=c(0.025,0.975))
dat$central <- dat$y>dat_q[1] & dat$y < dat_q[2]
#plot; one'95' violin and one 'all'-violin with transparent fill.
p1 <- ggplot(data=dat, aes(x=x,y=y)) +
geom_violin(data=dat[dat$central,], color="transparent",fill="gray90")+
geom_violin(color="black",fill="transparent")+
theme_classic()
Edit: các cạnh tròn làm phiền tôi, vì vậy đây là một cách tiếp cận thứ hai. Nếu tôi làm điều này, tôi sẽ muốn những đường thẳng. Vì vậy, tôi đã làm một số chơi với mật độ (đó là những gì các đồ thị violin được dựa trên)
d_y <- density(dat$y)
right_side <- data.frame(x=d_y$y, y=d_y$x) #note flip of x and y, prevents coord_flip later
right_side$central <- right_side$y > dat_q[1]&right_side$y < dat_q[2]
#add the 'left side', this entails reversing the order of the data for
#path and polygon
#and making x negative
left_side <- right_side[nrow(right_side):1,]
left_side$x <- 0 - left_side$x
density_dat <- rbind(right_side,left_side)
p2 <- ggplot(density_dat, aes(x=x,y=y)) +
geom_polygon(data=density_dat[density_dat$central,],fill="red")+
geom_path()
p2
Ah, chỉ cần đánh bại tôi! – Axeman
@Axeman Tuyệt vời suy nghĩ như nhau? Tôi đã thêm một phương pháp thứ hai. – Heroka
@Heroka, điều này thật tuyệt! Như bạn đã đoán, tôi đã vấp vào cách tiếp cận đầu tiên của bạn nhưng không hài lòng. Cách tiếp cận thứ hai của bạn là chính xác những gì tôi muốn. Cảm ơn nhiều! – dewarrn1