ggplot结合geom_scatterpie绘制地图报离散值传入连续标度错误
报错原因与修复方法
核心触发原因
- 填充美学的标度类型冲突是报错根源:你在
geom_tile层将连续型栅格数值映射到fill属性,同时全局配置了仅支持连续值输入的scale_fill_gradientn色阶;但geom_scatterpie会自动将传入的分组列(group1~group4)映射到fill美学,这部分传入的是离散的分类名称,和连续型色阶的输入要求不匹配,直接触发Discrete value supplied to continuous scale报错。这也是为什么你删掉栅格和对应色阶代码后,代码可以正常运行——此时只有饼图的离散fill映射,不存在类型冲突。 - 原代码存在两处书写错误,会额外导致运行异常:
geom_tile的美学映射中写了fill = values,但你提供的my_raster数据中不存在values列,实际存储栅格值的列名为focal_maxgeom_scatterpie的参数括号错位:你将color = "black"参数写在了colnames()函数的括号内部,会触发函数参数匹配错误
修复方案
要同时保留栅格底图和饼图,只需引入ggnewscale包的标度重置函数,将栅格层和饼图层的fill映射拆分为两套独立标度即可,同时修正上述书写bug。
修正后的可运行代码如下:
# 加载依赖包,缺少的请先安装 library(ggplot2) library(scatterpie) library(sf) library(ggthemes) library(ggnewscale) ggplot() + # 栅格底图层,修正映射列名 geom_tile(data = my_raster, aes(x = x, y = y, fill = focal_max)) + scale_fill_gradientn(colours = c("white", "white", "white", "white", "grey", "white", "white"), na.value = "white", guide = "none") + # 重置填充色标度,后续图层的fill映射不受前面连续色阶约束 new_scale_fill() + # 国界/行政区划层 geom_sf(data = europe_cropped, size = 0.1, color = "black", fill = "white", alpha = 0.4) + # 饼图层,修正括号错位问题 geom_scatterpie(aes(x = long, y = lat, r = 2), cols = colnames(my_table[2:5]), color = "black", data = my_table) + # 布局调整 ylab("") + xlab("") + coord_sf() + theme_few()
如果需要自定义饼图的四个分组配色,只需在geom_scatterpie层后追加scale_fill_manual(values = 你自定义的颜色向量)即可,不会影响栅格底图的显示效果。
内容的提问来源于stack exchange,提问作者Aedan-1996
相关产品推荐
相关产品推荐

