ggplot地图问题:按wsdi值条件着色城市点触发check_aesthetics错误
问题分析与解决方案
你的报错核心原因是数据处理时误删了绘图必需的列,同时还有几个语法逻辑问题,具体拆解:
- 多余的
group_by(city,wsdi):你要筛选特定年份和场景的数据,不需要先分组,分组反而可能导致数据冗余或逻辑混乱。 select(city)是致命错误:这一步只保留了city列,把绘图需要的lon、lat、wsdi都删掉了,ggplot找不到对应x/y轴和着色的数据,所以抛出美学长度不匹配的错误。fill = wsdi没放在aes()里:如果要用wsdi值映射颜色,必须把颜色参数放到aes()内部,否则只会用单一颜色(而且普通实心点的fill参数不生效,需要配合特定形状,用color更直接)。
修正后的代码:
# 筛选目标数据,保留所有需要的列 filtered_data <- data_frame1 %>% filter(scenario == 'historical' & year == 1997) # 注意:若year是数值型,去掉引号 # 绘图 ggplot() + borders("world", fill="white", colour="gray80") + geom_point(data = filtered_data, aes(x = lon, y = lat, color = wsdi), # 将color映射到wsdi,放入aes内 size = 0.03) + scale_color_viridis_c() # 可选:添加渐变颜色刻度,让数值映射更直观
额外说明:
- 检查
year列类型:如果是数值型,year == 1997不要加引号;字符型才用'1997',类型不匹配会导致筛选不到数据。 - 若坚持用
fill,需要给点指定带填充的形状(比如shape=21-25),示例:geom_point(data = filtered_data, aes(x = lon, y = lat, fill = wsdi), shape = 21, color = "black", size = 0.03)
内容的提问来源于stack exchange,提问作者ofelinda
相关产品推荐
相关产品推荐

