如何在ggplot2中为geom_boxplot映射变量自定义箱线图宽度?
手动指定ggplot2箱线图的箱体宽度
因为varwidth参数是按每组观测数自动调整宽度,没法满足手动指定相对宽度(比如1、2、3)的需求,这里提供两种更优的实现方法:
方法一:映射宽度变量并配合位置调整
给原数据框新增一个宽度变量,在aes中映射group和width,再用position_dodge确保箱体对齐:
library(ggplot2) set.seed(101) dd <- data.frame(f = factor(rep(LETTERS[1:3], each = 10)), y = rnorm(30)) # 添加对应每个类别的宽度变量 dd$box_width <- rep(c(1,2,3), each = 10) ggplot(dd, aes(f, y, group = f, width = box_width)) + geom_boxplot(position = position_dodge(width = max(dd$box_width)))
方法二:分图层单独绘制每个箱线图
如果不想修改原数据,可以针对每个类别单独设置宽度,通过微调x轴位置保证对齐:
ggplot() + # 绘制A类箱线图,宽度设为1 geom_boxplot(data = subset(dd, f == "A"), aes(x = 1, y = y), width = 1) + # 绘制B类箱线图,宽度设为2 geom_boxplot(data = subset(dd, f == "B"), aes(x = 2, y = y), width = 2) + # 绘制C类箱线图,宽度设为3 geom_boxplot(data = subset(dd, f == "C"), aes(x = 3, y = y), width = 3) + # 重置x轴标签与刻度 scale_x_continuous(breaks = 1:3, labels = LETTERS[1:3])
这两种方法都能精准控制箱体的相对宽度,比临时方案更灵活、易维护。
内容的提问来源于stack exchange,提问作者Ben Bolker
相关产品推荐
相关产品推荐

