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

如何为ggplot2多数据集拟合曲线添加r²值?

解决ggplot2添加线性拟合R²值的问题

首先,你当前代码存在几个冗余或错误的点:

  • 使用group_by分割数据集完全没必要,这不会改变数据结构,反而可能导致后续计算异常
  • 重复调用geom_point和geom_smooth过于繁琐,应该采用长格式数据简化代码,同时统一处理分组计算

步骤1:将数据转换为长格式

把原宽格式数据(三个丰度列)转为长格式,让ggplot自动识别分组:

library(dplyr)
library(tidyr)
library(ggplot2)

# 转换长格式:合并三个丰度列,生成分组列Growth_Form
tidy_lichen <- lichendata %>%
  pivot_longer(
    cols = starts_with("Relative_Abundance_"),
    names_to = "Growth_Form",
    names_prefix = "Relative_Abundance_",
    values_to = "Relative_Abundance"
  ) %>%
  # 将缩写替换为完整名称,匹配颜色映射
  mutate(Growth_Form = recode(Growth_Form, 
                             "CR" = "Crustiose", 
                             "FO" = "Foliose", 
                             "FR" = "Fruticose"))

步骤2:计算每个分组的R²值

定义函数计算线性模型的R²,再按分组生成标签数据:

# 计算R²的函数
get_r_squared <- function(data) {
  model <- lm(Relative_Abundance ~ Elevation_Avg, data = data)
  r2 <- summary(model)$r.squared
  paste0("R² = ", sprintf("%.2f", r2))
}

# 按分组计算R²,并设置标签显示位置(每个分组的右上角)
r2_labels <- tidy_lichen %>%
  group_by(Growth_Form) %>%
  summarise(
    r2_text = get_r_squared(cur_data()),
    x_pos = max(Elevation_Avg),
    y_pos = max(Relative_Abundance)
  )

步骤3:绘图并添加R²标签

用长格式数据绘图,自动处理分组,再通过geom_text添加标签:

colours <- c("Crustiose" = "cadetblue", "Foliose" = "goldenrod1", "Fruticose" = "indianred")

ggplot(tidy_lichen, aes(x = Elevation_Avg, y = Relative_Abundance, colour = Growth_Form)) +
  geom_point() +
  geom_smooth(method = "lm", se = FALSE) +
  # 添加R²标签,匹配对应分组颜色
  geom_text(data = r2_labels, aes(x = x_pos, y = y_pos, label = r2_text), 
            colour = colours[Growth_Form], hjust = 1, vjust = 1) +
  labs(x = "Average Elevation (m)", y = "Relative Abundance", colour = "Growth Form") +
  scale_colour_manual(values = colours)

替代方案:用ggpmisc包自动添加

如果不想手动计算,可使用ggpmisc包的stat_poly_eq直接生成拟合标签:

library(ggpmisc)

ggplot(tidy_lichen, aes(x = Elevation_Avg, y = Relative_Abundance, colour = Growth_Form)) +
  geom_point() +
  geom_smooth(method = "lm", se = FALSE) +
  stat_poly_eq(
    aes(label = paste(..rr.label.., sep = "~~~")),
    formula = y ~ x,
    parse = TRUE,
    colour = colours[Growth_Form]
  ) +
  labs(x = "Average Elevation (m)", y = "Relative Abundance", colour = "Growth Form") +
  scale_colour_manual(values = colours)

原方法失效原因

你之前尝试lm_eq类代码无显示,大概率是因为:

  • 拆分三个数据集后,lm_eq函数未正确对应每个分组的数据
  • 手动在aes外指定colour,导致分组映射混乱,标签无法匹配分组

内容的提问来源于stack exchange,提问作者zoey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 20:38:21