ggplot2可以创建一个非常有吸引力的填充小提琴情节:
ggplot() + geom_violin(data=data.frame(x=1, y=rnorm(10 ^ 5)), aes(x=x, y=y), fill='gray90', color='black') + theme_classic()
如果可能的话,我想将填充限制在95%的分布中心,保持轮廓完整.有没有人有关于如何做到这一点的建议?
这样做你想要的吗?它需要一些数据处理和两把小提琴的绘制.
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()
编辑:圆润的边缘困扰我,所以这是第二种方法.如果我这样做,我会想要直线.所以我做了一些玩密度(这是小提琴图所基于的)
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