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
相关产品推荐
相关产品推荐

