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

如何为ggplot2的facet_grid各分面添加对应模型的geom_text标签?

问题解决:ggplot2分面添加geom_text时的美学长度不匹配错误

问题背景

我有数据集df_test,需对比两个模型在不同癌症分期(pT)、时间点(time)的预测效果,用facet_grid(time ~ pT)绘图已正常,但想给每个分面添加对应两个模型的auc值文本。已将数据简化为label_test:

label_test <- df_test %>% select(time, pT, model, auc) %>% distinct()

运行以下代码时报错:

ggplot(df_test, aes(x = Pred, y = Obs, color = model)) + 
  facet_grid(time ~ pT) +
  geom_line() +
  geom_text(data = label_test,
            aes(x = 0, y = c(0.8, 0.9), label = auc), 
            size = 5, hjust = 0, show.legend = FALSE)

错误信息:

Error in check_aesthetics(): ! Aesthetics must be either length 1 or the same as the data (11): y

错误原因

报错核心是美学映射长度不匹配:label_test的行数(11行)与y = c(0.8, 0.9)的向量长度(2)不一致。ggplot要求美学映射的向量要么长度为1(全局统一值),要么与数据行数完全匹配。同时你的需求是每个分面内两个模型的文本放在不同位置,不能用全局短向量分配y值。

解决方案

给label_test添加一个y列,根据model分组指定不同的y坐标,确保每一行数据都有对应的位置值。

完整代码

library(tidyverse)

# 生成带y坐标的标签数据
label_test <- df_test %>% 
  select(time, pT, model, auc) %>% 
  distinct() %>%
  # 根据模型分配不同的y位置
  mutate(y = ifelse(model == "18LNY", 0.8, 0.9))

# 绘图
ggplot(df_test, aes(x = Pred, y = Obs, color = model)) + 
  facet_grid(time ~ pT) +
  geom_line() +
  geom_text(data = label_test,
            aes(x = 0, y = y, label = auc), 
            size = 5, hjust = 0, show.legend = FALSE)

补充说明

  • 若需调整文本位置,直接修改mutate中的y值即可(比如改成0.7和0.8)
  • 该方式直观易维护,确保每个分面内的两个模型文本自动对应到预设位置
  • 需保证label_test中的time和pT与主数据集完全匹配,确保分面文本对应正确

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 01:21:06