基于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会按顺序逐个检查条件:
- 先匹配中国的区域,给它们赋值红色;
- 再匹配朝韩区域,赋值蓝色;
- 最后用
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
相关产品推荐
相关产品推荐

