按分组修改点形状报错“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")
关键修改点
- 将
shape = object和color = object移动到geom_point()的aes()函数内部,告诉ggplot这是需要映射的分类变量,而非直接的形状/颜色值。 - 可选:将
df$object转为因子类型,确保类别顺序与scale_shape_manual、scale_color_manual中values的顺序完全匹配,避免映射错位。
内容的提问来源于stack exchange,提问作者scrletbgonia
相关产品推荐
相关产品推荐

