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

如何为ggplot绘制的Bland-Altman图添加含计算值的手动图例?

解决方案

不一定非要用scale_color_manual(),有几种更灵活的方式实现需求:

方法1:数据驱动生成带数值的图例(推荐)

把水平线的信息整理成数据框,通过映射color和linetype关联图例,同时在标签中嵌入计算出的数值,这样数值更新时图例标签会自动同步:

library(ggplot2)

# 整理水平线数据,包含带数值的标签
hline_df <- data.frame(
  y = c(mean_diff, lower, upper),
  stat_label = c(
    paste0("均值: ", round(mean_diff, 2)),
    paste0("下限: ", round(lower, 2)),
    paste0("上限: ", round(upper, 2))
  ),
  group = factor(c("均值", "下限", "上限"), levels = c("均值", "下限", "上限"))
)

ggplot(df, aes(avg, diff)) +
  geom_point(size=3) +
  # 通过映射关联水平线和图例
  geom_hline(aes(yintercept = y, linetype = group, color = group), data = hline_df) +
  # 单独添加0基准线
  geom_hline(yintercept = 0, linetype = "solid") +
  # 自定义颜色和线型
  scale_color_manual(values = c("均值" = "black", "下限" = "red", "上限" = "red")) +
  scale_linetype_manual(values = c("均值" = "dashed", "下限" = "dashed", "上限" = "dashed")) +
  # 统一图例标题
  labs(
    color = "统计指标",
    linetype = "统计指标",
    title = "Bland-Altman 图",
    y = "测量值差值",
    x = "测量值均值"
  ) +
  theme(legend.position = "right")

方法2:手动构建图例+标注数值

如果不想修改原有绘图逻辑,也可以保留单独的geom_hline调用,通过scale_*_manual手动设置图例标签,同时用annotate在图中添加数值:

library(ggplot2)

ggplot(df, aes(avg, diff)) +
  geom_point(size=3) +
  # 给每条线添加group映射以便生成图例
  geom_hline(yintercept = mean_diff, linetype="dashed", color = "black", aes(group = "均值")) +
  geom_hline(yintercept = lower, color = "red", linetype="dashed", aes(group = "下限")) +
  geom_hline(yintercept = upper, color = "red", linetype="dashed", aes(group = "上限")) +
  geom_hline(yintercept = 0) +
  # 添加数值标注
  annotate("text", label = paste0("均值: ", round(mean_diff,2)), y=mean_diff, x=600, hjust=0) +
  annotate("text", label = paste0("下限: ", round(lower,2)), y=lower, x=600, hjust=0, color="red") +
  annotate("text", label = paste0("上限: ", round(upper,2)), y=upper, x=600, hjust=0, color="red") +
  # 手动设置图例标签和样式
  scale_color_manual(
    values = c("均值"="black", "下限"="red", "上限"="red"), 
    labels = c(
      paste0("均值: ", round(mean_diff,2)), 
      paste0("下限: ", round(lower,2)), 
      paste0("上限: ", round(upper,2))
    )
  ) +
  scale_linetype_manual(
    values = c("均值"="dashed", "下限"="dashed", "上限"="dashed")
  ) +
  labs(
    color = "统计指标", 
    linetype = "统计指标",
    title = "Bland-Altman 图",
    y = "测量值差值", 
    x = "测量值均值"
  ) +
  theme(legend.position = "right")

注意事项

  • 方法1是更优选择,数据驱动的方式让代码更易维护,数值变化时无需手动修改图例标签
  • scale_color_manual()只是用来统一图例样式的工具之一,核心是通过**映射(aes)**让ggplot自动生成图例,而非必须依赖它

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 05:08:09