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

按分组修改点形状报错“Shape aesthetic contains invalid values”

问题:ggplot2地图按类别自定义点形状/颜色报错

制作包含3个不同类别点(dog、human、farm)的俄亥俄州局部地图,默认圆形点或统一修改符号可正常生成,但按类别自定义形状和颜色时持续报错,尝试转因子、重命名类别等方法无效。


地图构建代码

library(ggplot2)
library(maps)
library(dplyr)
county_df <- map_data('county')                  
countyMap <- subset(county_df, region=="ohio")   
countyMap$county <- countyMap$subregion
cnames <- aggregate(cbind(long, lat) ~ subregion, data=countyMap, FUN=mean)
lat_Gallia <- c(38.4, 39.1) #zooming in
lon_Gallia <- c(-82.0, -82.6) #zooming in

点数据框代码

object = c("dog", "human", "farm")
long = c(-82.190833, -82.243889, -82.284167)
lat = c(38.881111, 38.843056, 38.828889)
df = cbind.data.frame(object, long, lat)

原绘制代码(报错)

ggplot(countyMap, aes(long, lat)) +  
  geom_polygon(aes(group=group), colour='black', fill="white") +
  coord_map(ylim = lat_Gallia, xlim = lon_Gallia) + 
  geom_polygon(data=countyMap_sb, aes(group=group), colour='black', fill='black', alpha = 0.25) +
  geom_point(data = df, aes(long, lat), shape = object, color = object) +
  scale_shape_manual(values=c(0, 1, 2))+
  scale_color_manual(values=c('#999999','#E69F00', '#56B4E9'))+
  theme_minimal() +
  theme(legend.position = "top")

报错信息

Error in `geom_point()`:
! Problem while converting geom to grob.
ℹ Error occurred in the 3rd layer.
Caused by error in `translate_shape_string()`:
! Shape aesthetic contains invalid values: "dog", "human", and "farm".

仅修改颜色的报错代码

ggplot(countyMap, aes(long, lat)) +  
  geom_polygon(aes(group=group), colour='black', fill="white") +
  coord_map(ylim = lat_Gallia, xlim = lon_Gallia) + #this gives the zoom area 
  geom_polygon(data=countyMap_sb, aes(group=group), colour='black', fill='black', alpha = 0.25) +
  geom_point(data = df, aes(long, lat), color = object) +
  scale_color_manual(values=c('#999999','#E69F00', '#56B4E9'))+
  theme_minimal() +
  theme(legend.position = "top")

对应报错

Error in `geom_point()`:
! Problem while converting geom to grob.
ℹ Error occurred in the 3rd layer.
Caused by error:
! Unknown colour name: dog

解决方案

错误原因

核心问题是将shape和color的映射变量写在了aes()外部,ggplot会把object的字符串取值(如"dog")当成直接的形状代码/颜色名称,而这些字符串既不是有效的形状代码(形状需为0-25的数字或特定符号),也不是预定义的颜色名称,因此触发报错。

修正后的完整代码

library(ggplot2)
library(maps)
library(dplyr)

# 地图构建
county_df <- map_data('county')                  
countyMap <- subset(county_df, region=="ohio")   
countyMap$county <- countyMap$subregion
cnames <- aggregate(cbind(long, lat) ~ subregion, data=countyMap, FUN=mean)
lat_Gallia <- c(38.4, 39.1) 
lon_Gallia <- c(-82.0, -82.6) 

# 点数据框
object = c("dog", "human", "farm")
long = c(-82.190833, -82.243889, -82.284167)
lat = c(38.881111, 38.843056, 38.828889)
df = cbind.data.frame(object, long, lat)
# 可选:转为因子,确保类别顺序与scale参数的values对应
df$object <- factor(df$object, levels = c("dog", "human", "farm"))

# 绘制地图(关键修改:将shape和color放入aes内部)
ggplot(countyMap, aes(long, lat)) +  
  geom_polygon(aes(group=group), colour='black', fill="white") +
  coord_map(ylim = lat_Gallia, xlim = lon_Gallia) + 
  geom_polygon(data=countyMap_sb, aes(group=group), colour='black', fill='black', alpha = 0.25) +
  # 核心修改:shape和color作为映射变量放入aes()中
  geom_point(data = df, aes(long, lat, shape = object, color = object)) +
  scale_shape_manual(values=c(0, 1, 2))+
  scale_color_manual(values=c('#999999','#E69F00', '#56B4E9'))+
  theme_minimal() +
  theme(legend.position = "top")

关键修改点

  1. 将shape = object和color = object移动到geom_point()的aes()函数内部,告诉ggplot这是需要映射的分类变量,而非直接的形状/颜色值。
  2. 可选:将df$object转为因子类型,确保类别顺序与scale_shape_manual、scale_color_manual中values的顺序完全匹配,避免映射错位。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 23:44:52