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

如何在ggplot分面图中为每个分面单独添加对应R²值

解决ggplot2分面散点图按类别显示对应R²值的问题

要实现每个分面只显示对应类别的R²值,不要用annotate,而是把R²值做成和分面变量绑定的注释数据框,再用geom_text/geom_label添加,具体步骤如下:

步骤1:准备注释数据框

首先计算各分面类别的R²,然后构造包含分面变量、R²文本、注释位置的数据集,确保注释数据框的分面变量和绘图数据完全匹配:

library(ggplot2)

# 模拟绘图数据(替换成你的真实数据)
set.seed(123)
plot_data <- data.frame(
  var_type = rep(c("Amino acid", "HLA allele"), each = 50),
  x = c(rnorm(50, 10, 2), rnorm(50, 15, 3)),
  y = c(rnorm(50, 10, 2) + 0.7*rnorm(50,10,2), rnorm(50,15,3) + 0.8*rnorm(50,15,3))
)

# 计算两类的R²
r_sq_aa <- summary(lm(y ~ x, data = plot_data[plot_data$var_type == "Amino acid", ]))$r.squared
r_sq_hla <- summary(lm(y ~ x, data = plot_data[plot_data$var_type == "HLA allele", ]))$r.squared

# 构造注释数据框:必须包含分面变量var_type
annot_data <- data.frame(
  var_type = c("Amino acid", "HLA allele"),
  # 格式化R²文本,保留两位小数
  label = paste0("R² = ", round(c(r_sq_aa, r_sq_hla), 2)),
  # 设置注释位置:取每个分面的x最小值、y最大值,放在左上角
  x = c(min(plot_data$x[plot_data$var_type == "Amino acid"]), 
        min(plot_data$x[plot_data$var_type == "HLA allele"])),
  y = c(max(plot_data$y[plot_data$var_type == "Amino acid"]), 
        max(plot_data$y[plot_data$var_type == "HLA allele"]))
)

步骤2:绘图并添加对应注释

用geom_text指定注释数据框,ggplot会自动按分面变量匹配对应注释,不会出现重叠:

ggplot(plot_data, aes(x = x, y = y)) +
  geom_point(alpha = 0.6) +
  geom_smooth(method = "lm", se = FALSE, color = "red") + # 可选:添加拟合线
  facet_wrap(~var_type) +
  # 添加注释,指定注释数据框,hjust/vjust控制对齐方式
  geom_text(data = annot_data, aes(x = x, y = y, label = label),
            hjust = 0, vjust = 1, size = 4, fontface = "bold") +
  theme_bw()

关键说明

  • annotate会向所有分面添加相同内容,无法区分分面变量,所以不能用它实现分面专属注释。
  • 注释数据框必须包含和绘图数据一致的分面变量(这里是var_type),这样geom_text在分面时会自动筛选对应行的注释内容。
  • 可以调整x、y、hjust、vjust参数,把注释放在你需要的位置(比如右下角、中心等)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 16:32:44