如何在geom_split_violin中移除零值,同时保留ggpaired统计的零值?
配对数据带大量零值的可视化与统计检验解决方案
问题背景
使用ggpaired和introdataviz::geom_split_violin绘制配对观测箱线图时,遇到以下问题:
- 数据含大量零值,需让箱线图和
stat_compare_means的配对检验纳入零值计算 geom_split_violin生成的小提琴图无法显示零值分布,将零值替换为NA会导致统计检验丢失原始数据
解决思路
核心问题是geom_split_violin默认的密度平滑参数会掩盖零值的集中分布,无需修改原始零值,只需调整小提琴图的密度计算参数,同时保留原始数据用于统计分析和箱线图绘制。
修改后的代码示例
library(introdataviz) library(ggpubr) set.seed(42) first <- sample(c(rep(0,100), rnorm(50,15,2))) second <- sample(c(rep(0,100), rnorm(50,10,1))) df <- data.frame(first, second) ggpaired(df, cond1 = "first", cond2 = "second", line.color = "gray") + stat_compare_means(paired = TRUE) + introdataviz::geom_split_violin(trim = FALSE, alpha = .4, adjust = 0.5) + scale_y_continuous(limits = c(0, 22), expand = c(0, 0))
关键修改说明
trim=FALSE:关闭小提琴图的尾部截断,确保零值对应的密度峰能够完整显示adjust=0.5:降低密度平滑程度,让零值的集中分布更突出(可根据数据调整数值,越小越贴近原始分布)scale_y_continuous(limits = c(0,22)):替代ylim(),仅调整显示范围而非过滤数据,保证零值被纳入所有计算
进阶优化(可选)
如果零值的密度峰仍不够明显,可进一步缩小adjust值,或添加填充色区分组别:
ggpaired(df, cond1 = "first", cond2 = "second", line.color = "gray") + stat_compare_means(paired = TRUE) + introdataviz::geom_split_violin(trim = FALSE, alpha = .4, adjust = 0.3, aes(fill = group)) + scale_y_continuous(limits = c(0, 22), expand = c(0, 0)) + scale_fill_brewer(palette = "Set1")
内容的提问来源于stack exchange,提问作者Michl
相关产品推荐
相关产品推荐

