You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 08:50:45