ggplot中geom_text按position_group着色报错“Unknown colour name: QB”求助
ggplot2 颜色映射报错解决方案
问题场景
运行以下R代码绘制可视化时出现报错:
ggplot(data = plot_2022points_ALL, aes(ScoringSystem, Rank)) + ggbump::geom_bump(linewidth = 1.5, mapping = aes(group=player_display_name, color= I(team_color))) + geom_point(aes(group=player_display_name, color=I(team_color2)), size=4) + geom_text(data = plot_2022points_ALL %>% filter(ScoringSystem == "ENOsysrank"), aes(label=player_display_name, color=position_group), size = 4, fontface = "bold", nudge_x = -0.2, hjust = 1)
错误信息
Error in `geom_text()`: ! Problem while converting geom to grob. ℹ Error occurred in the 3rd layer. Caused by error: ! Unknown colour name: QB
需求与尝试
需求:
geom_bump和geom_point按team_color/team_color2的十六进制值着色geom_text按position_group字段(如QB、TE)着色
已尝试将color映射移至ggplot()全局aes中,问题未解决;已将颜色变量放入aes()内,怀疑是否与其他图层使用I()函数有关。
数据示例
| position_group | player_display_name | team | points | ScoringSystem | Rank | team_color |
|---|---|---|---|---|---|---|
| QB | Patrick Mahomes | KC | 485.4 | ENOsysrank | 1 | #E31837 |
| TE | Justin Jefferson | MIN | 378.7 | PPR | 6 | #4F2683 |
问题原因
报错核心是:geom_text中aes(color=position_group)的QB/TE是自定义类别,ggplot默认会把它们当作内置颜色名解析,但这些值不在ggplot的内置颜色列表里,因此报错。其他图层的I()函数是直接传入颜色值(跳过映射系统),和这个报错无关。
解决方法
需要为position_group的每个类别手动指定对应颜色,用scale_color_manual()完成映射:
修改后的完整代码:
library(ggplot2) library(ggbump) library(dplyr) ggplot(data = plot_2022points_ALL, aes(ScoringSystem, Rank)) + ggbump::geom_bump(linewidth = 1.5, mapping = aes(group=player_display_name, color= I(team_color))) + geom_point(aes(group=player_display_name, color=I(team_color2)), size=4) + geom_text(data = plot_2022points_ALL %>% filter(ScoringSystem == "ENOsysrank"), aes(label=player_display_name, color=position_group), size = 4, fontface = "bold", nudge_x = -0.2, hjust = 1) + # 根据你的position_group类别,手动分配对应颜色,按需调整 scale_color_manual(values = c( QB = "#E31837", TE = "#4F2683", RB = "#008E97", WR = "#A71930" ))
补充说明
- 使用
I()的图层不会被scale_color_manual()影响,因为I()是直接传入颜色值,不参与ggplot的颜色映射逻辑 - 如果不想手动指定所有颜色,也可以用
scale_color_discrete()让ggplot自动分配离散颜色,或者用scale_color_viridis_d()这类预设的离散配色方案
内容的提问来源于stack exchange,提问作者Ethan Okoshi
相关产品推荐
相关产品推荐

