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

基于ggplot与map_data的R语言多国家着色动物亚种分布图绘制问题求助

解决ggplot2绘制亚种分布图时国家颜色被覆盖的问题

嗨,我完全懂你的困扰!你猜的一点没错——连续用两次mutate设置fill列就是问题根源:第二个mutate会把整个fill列重新赋值,所以之前给中国设的红色直接被改成了默认的白色,只剩朝韩区域显示蓝色。

其实只要把多个着色条件合并成一次赋值就行,这里推荐用dplyr的case_when函数,比嵌套ifelse可读性强太多,后续加更多国家也更方便。

修正后的完整代码

library(maps)
library(mapdata)
library(ggplot2)
library(dplyr)

# 获取世界地图数据
world <- map_data('world')

# 用case_when批量设置颜色,按顺序匹配条件
world <- world %>%
  mutate(fill = case_when(
    # 第一个条件:中国设为红色
    region %in% c("China") ~ "red",
    # 第二个条件:朝韩设为蓝色
    region %in% c("North Korea", "South Korea") ~ "blue",
    # 默认条件:其他所有国家设为白色
    TRUE ~ "white"
  ))

# 绘制地图
ggplot(world, aes(long, lat, fill = fill, group = group)) + 
  xlim(-10, 150) + 
  ylim(-7, 100) + 
  theme_void() + 
  geom_polygon(colour = "gray") +  # 直接用geom_polygon绘制即可,无需重复用geom_map
  scale_fill_identity()

为什么这样能解决问题?

case_when会按顺序逐个检查条件:

  1. 先匹配中国的区域,给它们赋值红色;
  2. 再匹配朝韩区域,赋值蓝色;
  3. 最后用TRUE ~ "white"兜底,所有没匹配到前面条件的国家都设为白色。

这样就不会出现后面的条件覆盖前面设置的情况了。

如果你偏好嵌套ifelse的写法,也可以这样写(但条件多了会很乱):

world <- mutate(world, fill = ifelse(region %in% c("China"), "red", 
                                     ifelse(region %in% c("North Korea", "South Korea"), "blue", "white")))

另外注意:你原来的代码里geom_map设置了fill="white",这其实会和我们的fill映射冲突,所以直接删掉geom_map那行,用geom_polygon绘制就足够啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 22:54:07