如何在R中绘制按niv_alti分组的pour_eau、pour_MO双系列条形图
R 双系列分组条形图实现方法
你可以通过以下两种方案实现需求,核心是构造双系列的输入数据、开启分组绘图参数:
方案1:基础R barplot 实现(适配你现有写法)
核心要设置beside = TRUE参数,该参数控制条形是并排展示而非堆叠,同时将两个指标的数值整理为矩阵输入:
# 第一步:预处理数据,删除含NA的样本(4c行的pour_MO为缺失值,也可根据需求替换为0) mat_clean <- na.omit(mat) # 第二步:构造绘图矩阵,转置后每列对应一个海拔水平的两个指标数值 plot_mat <- t(mat_clean[, c("pour_eau", "pour_MO")]) # 第三步:绘制分组条形图 bar_pos <- barplot(plot_mat, beside = TRUE, # 核心参数:开启并排分组 names.arg = mat_clean$niv_alti, xlab = "海拔水平(niv_alti)", ylab = "数值", col = c("steelblue", "orange"), # 两个系列的填充色 ylim = c(0, max(plot_mat, na.rm = TRUE) + 5) # 调整y轴范围给图例/数值标签留空间 ) # 可选:添加图例 legend("topright", legend = c("含水率(pour_eau)", "有机质含量(pour_MO)"), fill = c("steelblue", "orange") ) # 可选:在条形上方添加数值标签 text(x = bar_pos, y = plot_mat + 0.8, labels = as.character(plot_mat), cex = 0.8)
方案2:ggplot2实现(更灵活的可视化方案)
用ggplot2的分组合并逻辑更清晰,适合后续调整样式:
library(ggplot2) library(tidyr) library(dplyr) # 1. 数据预处理:删除缺失值+宽表转长表 mat_long <- mat %>% na.omit() %>% pivot_longer(cols = c(pour_eau, pour_MO), names_to = "指标", values_to = "数值") # 2. 绘制分组条形图 ggplot(mat_long, aes(x = factor(niv_alti), y = 数值, fill = 指标)) + geom_col(position = position_dodge(0.9), width = 0.8) + labs(x = "海拔水平(niv_alti)", y = "数值") + scale_fill_manual(values = c("steelblue", "orange"), labels = c("含水率", "有机质含量")) + theme_bw()
注意事项
- 原数据存在两个海拔为-0.71的样本,如果你需要对同一海拔的数值做平均/求和后再绘图,可先按
niv_alti分组聚合后再执行绘图逻辑。 - 若需要保留含NA的4c样本,可将
na.omit(mat)替换为mat |> mutate(pour_MO = replace(pour_MO, is.na(pour_MO), 0)),将缺失值替换为0后绘图。
内容的提问来源于stack exchange,提问作者Von Linné
相关产品推荐
相关产品推荐

