在ggplot2中混合箱线图与小提琴图时保留箱线图须
解决隐藏小提琴图后箱线图须异常的问题
当你在ggplot2中叠加geom_violin()和geom_boxplot()后,若通过width=0隐藏小提琴图,会发现箱线图的须出现视觉变化——这是因为默认geom_violin()的trim=FALSE,会基于密度估计生成超出原始数据范围的尾部,导致绘图的y轴范围被扩大,让你误以为箱线图的须长度或异常值判定被干扰(实际箱线图的统计计算仍基于原始数据,只是视觉上因y轴范围变化产生错觉)。
以下是几种无需使用plot.type参数的解决方案:
方案1:给小提琴图设置trim=TRUE
通过trim=TRUE限制小提琴图的范围不超过原始数据的极值,这样即使隐藏小提琴图,y轴范围也会和单独绘制箱线图时一致,箱线图的须视觉上保持不变:
library(ggplot2) library(dplyr) df <- filter(mpg, class %in% c("compact", "midsize")) # 隐藏小提琴图且不影响箱线图的须 p1 <- ggplot(df, aes(class, hwy)) + geom_violin(width = 0, trim = TRUE) + # 截断到原始数据极值,避免范围溢出 geom_boxplot() p1
方案2:手动固定y轴范围为原始数据范围
如果需要完全不受小提琴图的范围影响,可以先获取单独箱线图的y轴范围,再应用到叠加图层中:
library(ggplot2) library(dplyr) df <- filter(mpg, class %in% c("compact", "midsize")) # 先绘制单独箱线图,提取其y轴范围 p_box <- ggplot(df, aes(class, hwy)) + geom_boxplot() box_ylim <- ggplot_build(p_box)$layout$panel_params[[1]]$y.range # 叠加图层并强制使用箱线图的y轴范围 p1 <- ggplot(df, aes(class, hwy)) + geom_violin(width = 0) + geom_boxplot() + coord_cartesian(ylim = box_ylim) p1
方案3:直接移除小提琴图图层(最彻底)
如果只是需要隐藏小提琴图,不需要保留该图层的存在,直接在代码中不添加geom_violin()即可,这样箱线图的表现和单独绘制时完全一致:
library(ggplot2) library(dplyr) df <- filter(mpg, class %in% c("compact", "midsize")) # 仅绘制箱线图,无小提琴图干扰 p1 <- ggplot(df, aes(class, hwy)) + geom_boxplot() p1
内容的提问来源于stack exchange,提问作者Indrajeet Patil
相关产品推荐
相关产品推荐

