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

如何用ggplot2绘制科索沃指定行政区的Choropleth地图?

解决科索沃行政区Choropleth地图制作问题

你用map_data("world")只能获取国家级别的地理数据,没有科索沃的细分行政区信息,所以找不到目标行政区的名称。下面是具体的解决方案:

步骤1:安装并加载必要的包

需要用到处理空间数据的sf、绘图的ggplot2、数据处理的dplyr,以及获取行政区边界的gadm:

install.packages(c("sf", "ggplot2", "dplyr", "gadm"))
library(sf)
library(ggplot2)
library(dplyr)
library(gadm)

步骤2:获取科索沃行政区边界数据

用gadm_sf函数获取科索沃的一级行政区(对应你需要的区域)空间数据:

# 获取科索沃一级行政区数据
kosovo_adm <- gadm_sf(country = "XK", level = 1)

# 查看当前行政区名称,确认和目标列表的匹配情况
print(kosovo_adm$NAME_1)

步骤3:统一行政区名称

数据源里的名称可能和你使用的拼写有差异(比如Prishtinë对应Pristina,Pejë对应Pecki),需要统一名称:

# 重命名行政区以匹配你的目标列表
kosovo_adm <- kosovo_adm %>%
  mutate(NAME_1 = case_when(
    NAME_1 == "Prishtinë" ~ "Pristina",
    NAME_1 == "Pejë" ~ "Pecki",
    NAME_1 == "Gjakovë" ~ "Gjakova",
    TRUE ~ NAME_1
  ))

# 筛选你需要的目标行政区
target_regions <- c("Ferizaj", "Gjakova", "Gjilan", "Mitrovica", "Pecki", "Pristina", "Prizren")
kosovo_subset <- kosovo_adm %>%
  filter(NAME_1 %in% target_regions)

步骤4:合并数据并绘制Choropleth地图

假设你有包含行政区和对应数值的数据框,将其与地理数据合并后绘图:

# 示例数据,请替换成你的实际数据
region_metrics <- data.frame(
  Region = target_regions,
  Value = c(15, 22, 18, 28, 25, 32, 20)
)

# 合并空间数据和数值数据
kosovo_merged <- kosovo_subset %>%
  left_join(region_metrics, by = c("NAME_1" = "Region"))

# 绘制地图
ggplot(kosovo_merged) +
  geom_sf(aes(fill = Value), color = "white", linewidth = 0.5) +
  geom_sf_text(aes(label = NAME_1), size = 3, color = "black") +
  scale_fill_gradient(low = "#f0f8ff", high = "#003366") +
  theme_minimal() +
  labs(title = "科索沃行政区指标分布图", fill = "指标数值") +
  theme(
    axis.text = element_blank(),
    axis.title = element_blank(),
    panel.grid = element_blank()
  )

备选方案:手动导入Shapefile

如果gadm包无法正常获取数据,可以直接下载科索沃一级行政区的Shapefile,用st_read()读取:

# 替换为你下载的Shapefile路径
kosovo_shp <- st_read("path/to/gadm41_XK_1.shp")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 03:37:39