ggplot绘制属水平d13C与d15N均值及误差散点图问题
问题解决:ggplot绘制带双指标误差棒的散点图
需求说明
需要绘制一张散点图,满足以下要求:
- x轴:各属(Genus)的d13C均值,附带标准差(sd)误差棒
- y轴:各属的d15N均值,附带标准差误差棒
- 数据点按纲(Class)字段着色
用户尝试的代码
用户分别计算了d15N和d13C的均值与标准差,但无法整合到同一张图:
N_mean_std <- NescoA %>% group_by(Genus) %>% summarise_at(vars(d15N), list(meanN=mean, sdN=sd)) %>% as.data.frame() C_mean_std <- NescoA %>% group_by(Genus) %>% summarise_at(vars(d13C), list(meanC=mean, sdC=sd)) %>% as.data.frame() # 尝试绘图(失败) ggplot(N_mean_std , aes(x=Genus, y=meanN)) + geom_errorbar(aes(ymin=meanN-sdN, ymax=meanN+sdN), width=.3) + geom_point(size=2) + geom_errorbar(aes(ymin=meanC-sdC, ymax=meanC+sdC), width=0.3)
数据集
NescoA <- structure(list(Class = c("Aves", "Arachnida", "Arachnida", "Arachnida", "Diplopoda", "Insecta", "Insecta", "Insecta", "Insecta", "Insecta", "Insecta", "Insecta", "Insecta", "Insecta", "Insecta", "Insecta", "Insecta", "Insecta", "Insecta", "Insecta"), Genus = c("Melospiza", "(Lycosidae)", NA, NA, "Cambala", NA, "Oulema", "Oulema", NA, NA, "(Scolytidae)", NA, "Forficula", NA, NA, NA, NA, "Anasa", NA, NA), site.code = c("NESCO_A", "NESCO_A", "NESCO_A", "NESCO_A", "NESCO_A", "NESCO_A", "NESCO_A", "NESCO_A", "NESCO_A", "NESCO_A", "NESCO_A", "NESCO_A", "NESCO_A", "NESCO_A", "NESCO_A", "NESCO_A", "NESCO_A", "NESCO_A", "NESCO_A", "NESCO_A"), d13C = c(-24.61, -25.07, -25.27, -22.84, -19.95, -28.04, -19.57, -24.3, -20.16, -18.99, -18.54, -27.66, -24.75, -30.18, -28.59, -19.78, -14.52, -26.18, -25.02, -26.32), d15N = c(4.39, 4.32, 6.27, 4.2, 2.31, 1.22, -0.27, 0.91, 0.08, 4.32, 2.46, -0.63, -0.9, 7.46, 6.15, 1.2, 1.13, 0.94, 0.23, 4.6)), row.names = c(NA, 20L), class = "data.frame")
解决方案
关键问题分析
- 分开统计碳、氮数据后,不仅需要合并数据集,还丢失了
Class信息,无法实现按纲着色 - 绘图代码错误地将x轴设为
Genus,且误用垂直误差棒来表示x轴的水平误差
完整解决代码
步骤1:整合数据统计
一次性完成双指标的均值、标准差计算,同时保留Class信息:
library(tidyverse) # 过滤Genus为空的记录,按Genus+Class分组统计 summary_data <- NescoA %>% filter(!is.na(Genus)) %>% group_by(Genus, Class) %>% summarise( meanC = mean(d13C, na.rm = TRUE), sdC = sd(d13C, na.rm = TRUE), meanN = mean(d15N, na.rm = TRUE), sdN = sd(d15N, na.rm = TRUE), .groups = "drop" )
步骤2:绘制目标图
使用水平误差棒对应x轴的d13C误差,垂直误差棒对应y轴的d15N误差:
ggplot(summary_data, aes(x = meanC, y = meanN, color = Class)) + # x轴水平误差棒(d13C标准差) geom_errorbarh(aes(xmin = meanC - sdC, xmax = meanC + sdC), height = 0.2) + # y轴垂直误差棒(d15N标准差) geom_errorbar(aes(ymin = meanN - sdN, ymax = meanN + sdN), width = 0.3) + # 散点 geom_point(size = 3) + # 标签与主题优化 labs( x = "d13C 均值 ± 标准差", y = "d15N 均值 ± 标准差", color = "纲(Class)", title = "各属稳定同位素均值及误差分布" ) + theme_bw()
效果说明
- 每个数据点代表一个属,颜色对应其所属的纲
- x轴方向的误差棒展示d13C的离散程度,y轴方向展示d15N的离散程度
- 过滤了Genus为空的记录,避免无意义的分组干扰
内容的提问来源于stack exchange,提问作者Jeff Stratford
相关产品推荐
相关产品推荐

