用ggplot2分割小提琴图

我想使用ggplot创建分割的小提琴密度图,就像seaborn文档的此页上的第四个示例一样。


http://img.mukewang.com/5da823af0001430605760432.jpg

这是一些数据:


set.seed(20160229)


my_data = data.frame(

    y=c(rnorm(1000), rnorm(1000, 0.5), rnorm(1000, 1), rnorm(1000, 1.5)),

    x=c(rep('a', 2000), rep('b', 2000)),

    m=c(rep('i', 1000), rep('j', 2000), rep('i', 1000))

)

我可以像这样绘制躲避的小提琴:


library('ggplot2')


ggplot(my_data, aes(x, y, fill=m)) +

  geom_violin()

http://img3.mukewang.com/5da823b600010ff706760448.jpg

但是,很难在视觉上比较并排分布中不同点的宽度。我在ggplot中找不到拆分小提琴的任何示例-可能吗?


我找到了基本的R图形解决方案,但是该功能相当长,并且我想突出显示分发模式,可以很容易地在ggplot中将其添加为其他层,但是如果我需要弄清楚如何编辑该功能,则将很难进行。


凤凰求蛊
浏览 3334回答 2
2回答

摇曳的蔷薇

注意:我认为jan-glx的答案要好得多,大多数人应该改用它。您可以通过自己先计算密度,然后绘制多边形来实现。大致请见下文。获取密度library(dplyr)pdat <- my_data %>%&nbsp; group_by(x, m) %>%&nbsp; do(data.frame(loc = density(.$y)$x,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; dens = density(.$y)$y))组的翻转和偏移密度pdat$dens <- ifelse(pdat$m == 'i', pdat$dens * -1, pdat$dens)pdat$dens <- ifelse(pdat$x == 'b', pdat$dens + 1, pdat$dens)情节ggplot(pdat, aes(dens, loc, fill = m, group = interaction(m, x))) +&nbsp;&nbsp; geom_polygon() +&nbsp; scale_x_continuous(breaks = 0:1, labels = c('a', 'b')) +&nbsp; ylab('density') +&nbsp; theme_minimal() +&nbsp; theme(axis.title.x = element_blank())结果
打开App,查看更多内容
随时随地看视频慕课网APP