You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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")

解决方案

关键问题分析

  1. 分开统计碳、氮数据后,不仅需要合并数据集,还丢失了Class信息,无法实现按纲着色
  2. 绘图代码错误地将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 01:19:54