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

R语言中同时映射连续与离散值到地图时出现刻度类型错误

解决叠加温度地图与散点饼图时的Error: Discrete value supplied to continuous scale问题

你碰到的这个报错,核心原因是两个图层的美学映射规则冲突了:

  • 第一个geom_map使用了连续数值型的fill = temp作为填充映射,这个规则会被后续图层默认继承;
  • 而geom_scatterpie需要用离散的类别(cat_1/cat_2/cat_3)来填充饼图,当它试图用离散值去适配已经被定义为连续型的fill刻度时,就触发了这个错误。

下面给你两种简单可行的解决办法:

方法1:给散点饼图禁用美学映射继承

只需要在geom_scatterpie里添加inherit.aes = FALSE参数,让它忽略主图层的fill映射规则,自己用离散类别的填充逻辑:

library(scatterpie)
library(tidyverse)
library(geosphere)

us <- map_data('state') %>% as_tibble()
n = length(unique(us$region))
# 创建模拟映射数据
temperature_data <- tibble(region = unique(us$region), temp = rnorm(n = n))
coords <- us %>% select(long, lat, region) %>% distinct(region, .keep_all = T)
category_data <- tibble(region = unique(us$region), cat_1 = sample(1:100, size = n), cat_2 = sample(1:100, size = n), cat_3 = sample(1:100, size = n)) %>% left_join(coords)
us <- left_join(us, temperature_data)

p <- ggplot(us, aes(long, lat))

# 修复后的叠加代码
p + 
  geom_map(map = us, aes(map_id = region, fill = temp), color = 'grey') + 
  geom_scatterpie(data = category_data, aes(long, lat), 
                  cols = c("cat_1", "cat_2", "cat_3"), 
                  alpha = 0.5,
                  inherit.aes = FALSE)  # 关键:禁用继承

方法2:把温度的fill映射限定在地图图层内部

换一种写法,直接在geom_map里定义完整的局部美学映射,不让fill规则泄露到全局,这样后续的geom_scatterpie就不会受影响:

# 重新构建图层,避免全局传递fill映射
p <- ggplot() +
  geom_map(data = us, 
           aes(x = long, y = lat, map_id = region, fill = temp), 
           map = us, color = 'grey') +
  geom_scatterpie(data = category_data, aes(long, lat), 
                  cols = c("cat_1", "cat_2", "cat_3"), 
                  alpha = 0.5)
p

额外优化:区分双图例

如果需要让温度和饼图类别的图例清晰区分,可以分别设置连续和离散的颜色刻度,还能调整图例顺序:

p + 
  geom_map(map = us, aes(map_id = region, fill = temp), color = 'grey') + 
  geom_scatterpie(data = category_data, aes(long, lat), 
                  cols = c("cat_1", "cat_2", "cat_3"), 
                  alpha = 0.5,
                  inherit.aes = FALSE) +
  # 温度的连续色标
  scale_fill_continuous(name = "Temperature", low = "#4292c6", high = "#d73027") +
  # 饼图类别的离散色标,调整图例顺序在后面
  scale_fill_discrete(name = "Category", guide = guide_legend(order = 2))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 13:22:45