我想使用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 關注
- 3374 瀏覽
添加回答
舉報
0/150
提交
取消