如何为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
相关产品推荐
相关产品推荐

