我想使用ggplot创建分割的小提琴密度图,就像seaborn文档的此页上的第四个示例一样。这是一些数据: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()但是,很难在视觉上比较并排分布中不同点的宽度。我在ggplot中找不到拆分小提琴的任何示例-可能吗?我找到了基本的R图形解决方案,但是该功能相当长,并且我想突出显示分发模式,可以很容易地在ggplot中将其添加为其他层,但是如果我需要弄清楚如何编辑该功能,则将很难进行。
2 回答
摇曳的蔷薇
TA贡献1793条经验 获得超6个赞
注意:我认为jan-glx的答案要好得多,大多数人应该改用它。
您可以通过自己先计算密度,然后绘制多边形来实现。大致请见下文。
获取密度
library(dplyr)
pdat <- my_data %>%
group_by(x, m) %>%
do(data.frame(loc = density(.$y)$x,
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))) +
geom_polygon() +
scale_x_continuous(breaks = 0:1, labels = c('a', 'b')) +
ylab('density') +
theme_minimal() +
theme(axis.title.x = element_blank())
结果
- 2 回答
- 0 关注
- 3333 浏览
添加回答
举报
0/150
提交
取消