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

