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

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_max
    • geom_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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 09:00:55