R语言ggplot调用scale_colour_manual出现未知颜色名报错求助
报错根因
- 你将
colour参数写在了aes()映射外部,这种场景下R会直接把传入的字符串解析为实际颜色值,"Afghanistan"不是R内置的合法颜色名称,直接触发报错。 - 你定义的
scale_colour_manual()色盘是用来映射变量取值到自定义颜色的,只有把colour参数放入aes()内部,这个自定义色盘才会生效。 - 额外说明:你当前使用的是宽格式数据集,每个国家的GDP、庇护申请数据都单独设为列,用ggplot绘图时需要为每个国家重复写图层,非常冗余,更推荐先转为长格式再绘图。
修复方案
方案1:推荐(转为长表后绘图,代码简洁易维护)
# 加载依赖包(如果未安装先执行install.packages("tidyverse")) library(tidyverse) # 1. 宽表转长表,适配ggplot数据结构要求 full_long <- full %>% # 拆分列名,提取国家名称和指标类型 pivot_longer(cols = everything(), names_to = c("country", "indicator"), names_sep = "_") %>% # 按指标展开,每行对应一个国家单年度的两类指标数据 pivot_wider(names_from = indicator, values_from = value) # 自定义国家色盘 country_colors <- c("Afghanistan"="darkgreen","Iraq"="red" ,"Mali"="green", "Nigeria"="purple","Senegal"="orange") # 2. 绘图代码,无需为每个国家重复写图层 ggplot(data = full_long, aes(x = GDPpC, y = AS, colour = country)) + geom_point() + geom_smooth(method = "lm", se = FALSE) + # 不需要置信区间可以加se=FALSE,和你原有效果一致 scale_colour_manual(values = country_colors) + labs (x = "对数人均GDP", y = "首次庇护申请对数", colour = "国家") + theme_classic()
方案2:不转表,直接修改原有代码
如果不想调整数据格式,只需要把所有geom_point、geom_smooth里的colour参数移到aes()内部即可,示例如下:
a <- c("Afghanistan"="darkgreen","Iraq"="red" ,"Mali"="green", "Nigeria"="purple","Senegal"="orange") ggplot(data = full) + scale_colour_manual(values=a) + geom_point(aes(x=Afghanistan_GDPpC, y=Afghanistan_AS, colour = "Afghanistan")) + geom_smooth(aes(x=Afghanistan_GDPpC, y=Afghanistan_AS, colour = "Afghanistan"), method = "lm") + geom_point(aes(x=Iraq_GDPpC, y=Iraq_AS, colour = "Iraq")) + geom_smooth(aes(x=Iraq_GDPpC, y=Iraq_AS, colour = "Iraq"), method = "lm") + # 其余国家图层同理修改,把colour参数放进aes()里即可 labs (x = "对数人均GDP", y = "首次庇护申请对数", colour = "国家") + theme_classic()
内容的提问来源于stack exchange,提问作者pegasus123
相关产品推荐
相关产品推荐

