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
相关产品推荐
相关产品推荐

