R语言中如何合并boxplot函数生成的两个独立箱线图
base R实现两个箱线图合并展示的可运行方案
首先先修正你原代码里的小问题:base R的boxplot()函数识别数据集的参数是data而非dataset,直接跑原代码的第一个绘图语句会因为找不到变量报错。下面所有代码都可以基于你提供的数据集直接运行,不需要读取本地csv。
# 直接加载你提供的内置数据集,无需读本地文件 data3 <- structure(list(CLJ = c(39L, 21L, 43L, 24L, 16L, 28L, 45L, 46L, 69L, 15L, 38L, 28L, 50L, 51L, 8L, 46L, 25L, 35L, 59L, 24L, 48L, 44L, 33L, 27L, 51L, 49L, 70L, 53L, 46L, 26L, 49L, 39L, 23L, 52L, 81L, 36L, 52L, 43L, 19L, 17L, 37L, 68L, 41L, 34L, 22L, 16L, 58L, 73L, 77L, 37L), accuracy = c(18L, 25L, 23L, 22L, 20L, 14L, 31L, 20L, 24L, 6L, 24L, 12L, 16L, 24L, 23L, 15L, 14L, 24L, 42L, 19L, 27L, 13L, 23L, 6L, 28L, 30L, 22L, 33L, 12L, 21L, 38L, 16L, 17L, 11L, 29L, 18L, 22L, 21L, 29L, 19L, 17L, 28L, 20L, 35L, 14L, 14L, 35L, 30L, 18L, 37L), group = c("B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "B", "I", "I", "I", "I", "I", "I", "I", "I", "I", "I", "I", "I", "I", "I", "I", "I", "I", "I", "I", "I", "I", "I", "I", "I", "I")), row.names = c(NA, 50L), class = "data.frame")
方案1:同画布分栏排布
保留两个箱线图独立的坐标轴、配色,把两个图按行/列拆分在同一个画布上,适配你原来单独绘图的代码习惯,不需要大改逻辑:
- 核心操作:用base R自带的
par()函数调整画布布局参数 - 可运行代码:
# 设置画布为2行1列的布局(上下摆放两个图),统一调整边距避免标签重叠 par(mfrow = c(2, 1), mar = c(4, 4, 2, 1)) # 绘制第一个箱线图,去掉下方x轴标签避免和第二个图的标签重复 boxplot(CLJ ~ group, data = data3, col = "orange", na.rm=TRUE, xlab= "", ylab = "CLJ", ylim = c(0, 80), yaxs = "I") # 绘制第二个箱线图,保留底部x轴标签 boxplot(accuracy ~ group, data = data3, col = "yellow", na.rm=TRUE, xlab = "group", ylab = "accuracy", ylim = c(0, 80), yaxs = "I") # 绘图完成后恢复默认画布参数,避免影响后续绘图 par(mfrow = c(1,1), mar = c(5,4,4,2))
调整提示:如果需要左右并排摆放两个图,把mfrow = c(2,1)改为mfrow = c(1,2)即可,按需调整标签位置避免文字遮挡。
方案2:单坐标轴并排合并
把两个指标的箱线图整合到同一个坐标轴下,实现同分组下两个指标的箱线并排对比,是更紧凑的合并展示效果:
- 核心操作:把宽表转为长表,让boxplot识别“指标-分组”的交叉分类
- 可运行代码:
# 宽转长,把CLJ、accuracy两列合并为单列数值,新增列标记指标类型 data_long <- reshape( data3, varying = c("CLJ", "accuracy"), v.names = "value", timevar = "metric", times = c("CLJ", "accuracy"), direction = "long" ) # 单轴绘制并排箱线图 boxplot(value ~ metric + group, data = data_long, col = c("orange", "yellow"), na.rm = TRUE, ylim = c(0, 80), yaxs = "I", xlab = "分组", ylab = "指标数值" ) # 添加图例区分两个指标的配色 legend("topright", legend = c("CLJ", "accuracy"), fill = c("orange", "yellow"))
效果说明:公式value ~ metric + group会自动按分类组合排列箱线,最终画布上依次展示B组的CLJ、B组的accuracy、I组的CLJ、I组的accuracy四个箱线,配色和你单独绘图的颜色完全一致。
内容的提问来源于stack exchange,提问作者Deema
相关产品推荐
相关产品推荐

