为了账号安全,请及时绑定邮箱和手机立即绑定

用ggplot2分割小提琴图

用ggplot2分割小提琴图

凤凰求蛊 2019-10-17 16:17:26
我想使用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())

结果

//img1.sycdn.imooc.com//5da823dc0001623606170369.jpg

查看完整回答
反对 回复 2019-10-17
  • 2 回答
  • 0 关注
  • 3203 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信