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

ggplot2中仅单个x轴层级的箱线图与小提琴图错位问题

问题原因与解决办法

错位原因

position_dodge()的偏移量是根据每个x轴分组(此处为gender)下的fill类别(films)数量计算的。masculine组包含所有films的条目,每个films的偏移位置按总类别数均分;但feminine组缺少Return of the Jedi的女性角色数据,该组内films类别数量更少,导致dodge的间距计算基准与masculine组不一致,最终同一films对应的箱线图、小提琴图在不同gender组里错位。

修复代码

在数据处理阶段用complete()补全gender和films的所有组合,缺失数据保留NA,确保每个gender组下的films类别数量完全一致,让dodge偏移量统一:

# 移除Jabba the Hut这个极端值
starwars$mass[which(starwars$mass>1000)] <- NA

starwarsunnested <- starwars %>% 
  unnest(films) %>%
  # 补全gender和films的所有组合,缺失的mass设为NA
  complete(gender, films, fill = list(mass = NA))

pos <- position_dodge(0.9)

starwarsunnested %>% 
  drop_na() %>% 
  ggplot(aes(x = gender, y = mass, fill=films)) +
  geom_violin(position = pos) +
  geom_boxplot(width = .2, 
               fatten = NULL, 
               position = pos)  +
  stat_summary(fun = "mean", 
               geom = "point", 
               position = pos) +
  stat_summary(fun.data = "mean_se", 
               geom = "errorbar", 
               width = .1,
               position = pos)

效果说明

补全后,每个gender组都包含所有films类别(即便无对应数据),position_dodge()会基于相同的类别数量计算偏移量,同一films对应的小提琴图、箱线图、均值点等元素就能在不同gender组里精准对齐。

内容的提问来源于stack exchange,提问作者JElder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 18:01:17