geom_density_ridges不绘制样本量为2的分组,如何解决?
ggridges跳过小样本分组的原因及解决办法
问题重现
当使用ggridges绘制Joy图时,仅含2个数据点的分组会被自动跳过,但geom_violin可以正常显示所有分组。示例代码如下:
df <- data.frame(class=factor(c("a","a","a","b","b")),value=c(2,4,5,2,3)) # geom_violin正常显示两个分组 ggplot(df,aes(y=class,x=value)) + geom_violin() # geom_density_ridges仅显示分组a ggplot(df,aes(y=class,x=value)) + geom_density_ridges()
二者差异原因
- geom_violin:针对极小样本做了兼容处理,即使只有2个数据点,也会通过核密度估计生成简化的分布轮廓,不会因样本量不足过滤分组。
- geom_density_ridges:默认设置了
rel_min_height = 0.01的过滤规则——仅保留密度峰值达到整体最高密度1%的分组。仅2个数据点的分组生成的密度曲线峰值极低,无法满足该阈值,因此被自动跳过;同时默认的核密度带宽对极小样本适配性差,进一步加剧了这个问题。
解决办法
调整geom_density_ridges的参数,取消密度峰值限制并优化带宽,即可显示所有分组:
ggplot(df,aes(y=class,x=value)) + geom_density_ridges(rel_min_height = 0, bandwidth = 0.6)
rel_min_height = 0:取消密度峰值的最低比例要求,强制显示所有分组的密度曲线。bandwidth = 0.6:手动指定带宽,让小样本的密度曲线轮廓更合理(可根据数据实际情况调整)。
内容的提问来源于stack exchange,提问作者Micah
相关产品推荐
相关产品推荐

