R语言绘制多列箱线图及均值标准差参考线错位问题求解
R箱线图绘制代码修正方案
原代码错误点
- 冗余无效行:
plotorder <- sort(unique(df2$SAMPLE_NO))错误访问列表df2中不存在的SAMPLE_NO字段,无实际作用还可能触发报错 - 坐标轴范围逻辑错误:
coord_cartesian(ylim = as.numeric(c(min(.y),max(.y))))中.y是指标名称字符串,取最值得到的是字符串排序结果,而非对应指标的数值范围 - 参考线计算错误:第三条红色参考线误将标准差作为基准值计算,导致参考线位置完全偏移
修正后完整代码
首先加载依赖包:
library(tidyverse)
绘图代码:
imap(df2, ~{ # 提取当前指标的数值列,用于设置合理的y轴范围 current_col <- df[[.y]] ggplot(df, outlier.shape = NA, mapping = aes(x = SAMPLE_NO, y = .data[[.y]], color = SAMPLE_NO)) + stat_boxplot(geom = 'errorbar')+ # 用实际数值的范围设置y轴,小幅扩展避免图形贴边 coord_cartesian(ylim = range(current_col) * c(0.99, 1.01))+ geom_boxplot(outlier.shape = NA) + geom_hline(linetype = 'dashed', color = 'blue', size = 0.75, yintercept = .x[["hm"]]) + # 直接通过字段名取均值,避免索引错误 geom_hline(linetype = 'dashed', color = 'firebrick', size = 0.75, yintercept = .x[["hm"]] - .x[["hsd"]] * 3) + # 均值减3倍标准差 geom_hline(linetype = 'dashed', color = 'firebrick', size = 0.75, yintercept = .x[["hm"]] + .x[["hsd"]] * 3) + # 修正为均值加3倍标准差 ggtitle(paste0(.y, " 均匀性箱线图")) + theme(plot.title = element_text(hjust = 0.5)) + xlab(label = "样品编号") + ylab(paste0(.y, ' 含量占比(%)')) }) -> list_plot_box # 输出所有生成的箱线图 list_plot_box
修正效果说明
- 自动匹配df2中存储的所有指标,4个指标都会生成对应的箱线图,不会出现缺漏
- 所有参考线位置匹配实际均值、3倍标准差的计算逻辑,无偏移问题
- 坐标轴范围自动适配不同指标的量级,不会出现数据被截断的情况
内容的提问来源于stack exchange,提问作者Spooked
相关产品推荐
相关产品推荐

