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

如何使用ggplot2的geom_map为各国区域填充对应国旗图案

国旗图案填充地图实现方法

原生ggplot2的geom_map/geom_polygon仅支持纯色填充,要实现国旗图案填充替换纯色,直接使用支持图片纹理填充的扩展包即可,改造成本极低,原有数据处理逻辑可以完全复用。


方案1:ggpattern 图片填充(和预期效果完全匹配)

ggpattern是ggplot2的扩展包,支持给任意多边形区域填充图片、纹理、渐变等效果,是实现区域图案填充最直接的方案。

  • 第一步安装并加载依赖包:
# 安装缺失包
install.packages(c("ggpattern", "maps", "tidyverse", "countrycode"))
# 加载包
library(tidyverse)
library(maps)
library(ggpattern)
library(countrycode)
  • 第二步直接复用原有数据处理代码,不需要修改:
ALL_EU <-c("Russia", "Germany", "UK", "France", "Italy", "Spain", "Ukraine", "Poland", "Romania", "Netherlands", "Belgium", "Czech Republic", "Greece", "Portugal", "Sweden", "Hungary", "Belarus", "Austria", "Serbia", "Switzerland", "Bulgaria", "Denmark", "Finland","Slovakia", "Norway", "Ireland", "Croatia", "Moldova", "Bosnia and Herzegovina","Albania", "Lithuania", "North Macedonia", "Slovenia", "Latvia", "Estonia","Montenegro", "Luxembourg", "Malta", "Iceland", "Andorra", "Monaco", "Liechtenstein","San Marino", "Vatican", "Kosovo")

# 原有区域过滤逻辑完全保留
world_map <- map_data("world",region = ALL_EU[-which(ALL_EU%in%c("Russia","Iceland"))])
world_map <- world_map%>%filter(subregion!="Svalbard"&subregion!="Jan Mayen"|is.na(subregion))
  • 第三步给每个国家匹配对应的国旗文件路径:
    *如果不想依赖在线资源,可以提前把所有需要的国旗图片下载到本地文件夹,命名为「国家名.png」,直接生成本地文件路径即可,逻辑完全一致。个别名称匹配特殊的地区(比如科索沃、梵蒂冈)手动补全路径即可。
country_flag_df <- tibble(
  region = unique(world_map$region)
) %>% 
  # 自动匹配国家编码对应国旗,本地使用替换为自己的文件路径即可
  mutate(iso2 = tolower(countrycode(region, origin = "country.name", destination = "iso2c")),
         flag_path = paste0("flags/", iso2, ".png")) # 这里替换为本地存国旗的文件夹路径

# 把国旗路径合并到地图数据中
world_map <- world_map %>% left_join(country_flag_df, by = "region")
  • 第四步替换绘图的几何层,实现图片填充:
    把原来的geom_map替换为geom_polygon_pattern,指定填充类型为图片即可:
ggplot() +
  theme_void() +
  geom_polygon_pattern(
    data = world_map,
    aes(x = long, y = lat, group = group, pattern_filename = I(flag_path)),
    pattern = "image", # 指定填充模式为图片
    pattern_type = "expand", # 图片自动拉伸适配多边形边界,不想变形可以换成"fit"
    color = "gray", # 国界线颜色
    size = 0.25 # 国界线粗细
  ) +
  expand_limits(x = world_map$long, y = world_map$lat)

可以通过调整pattern_scale、pattern_gravity参数修改图片的缩放比例、对齐方式,避免国旗图案过度变形。


拓展需求:多国家统一填充指定图案(如欧盟旗帜)

实现逻辑非常简单,不需要修改绘图代码,只要在匹配文件路径的步骤中,把需要统一填充的国家的路径替换为目标图案的路径即可:

# 欧盟旗帜本地路径
eu_flag_path <- "flags/eu.png"
# 指定需要统一填充欧盟旗帜的国家列表
eu_member_list <- c("Germany", "France", "Italy", "Spain", "Poland", "Romania", "Netherlands", "Belgium", "Czech Republic", "Greece", "Portugal", "Sweden", "Hungary", "Austria", "Bulgaria", "Denmark", "Finland","Slovakia", "Ireland", "Croatia", "Lithuania", "Slovenia", "Latvia", "Estonia", "Luxembourg", "Malta")

country_flag_df <- country_flag_df %>% 
  mutate(flag_path = ifelse(region %in% eu_member_list, eu_flag_path, flag_path))

后续按原有逻辑绘图即可实现批量国家统一图案填充。


备选轻量化方案

如果不需要把国旗铺满整个国土区域,仅需要在国家中心点位置标注国旗,可以使用ggflags包,直接映射国旗矢量图标到对应坐标点,代码更简洁,适合标注类可视化场景。


内容的提问来源于stack exchange,提问作者Joaquín L

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 16:33:15