可以在该网站下载json格式的地图数据,包括省市县三级的数据以及国界线、海南线等等。数据是符合民政部规范。
- library(tidyverse)
- library(sf)
- library(ggspatial)
- library(RColorBrewer)
- library(sjmisc)
-
-
- ##中国行政区划编码
- ##数据在公众号玩蛇皮SnakeCharmer回复“教程数据”获取
- prov = readxl::read_xlsx("./data/china_map/中国行政区划-省.xlsx")
- prov
-
- ##---------------------------------------------------------------
- ##1.省级地图
- #数据准备
- #业务数据
- ##数据在公众号玩蛇皮SnakeCharmer回复“教程数据”获取
- data = read_csv("./data/2022分省粮食产量_万吨.csv", locale = locale(encoding = 'gbk'))
-
- ##地图区矢量数据
- china_prov = read_sf("./data/china_map/2023/china_prov.geojson") %>%
- left_join(data, join_by(name==region)) %>%
- mutate(prod_lev = cut(product,
- breaks = c(0, 100, 1000, 2000, 4000, 6000, 8000))) %>%
- left_join(prov, by="adcode")
-
- china_line = read_sf("./data/china_map/2023/china_line.geojson")
-
- #作图
- pal = c("#50b98f", "#92ce6e", "#edda0e", "#e5b107", "#d25c02", "#c01f33")
- ggplot() +
- geom_sf(data=china_prov,
- aes(fill=prod_lev),
- color = "#011910", linewidth=0.15) +
- geom_sf(data=china_line,
- color = "#011910", linewidth=0.5)+
- geom_sf_text(data = china_prov,
- aes(label = str_c("\n", short.name)),
- size=2) +
- geom_sf_text(data = china_prov,
- aes(label = round(product)),
- size=3, nudge_y = 50000) +
- coord_sf(crs = "+proj=laea +lat_0=40 +lon_0=104") +
-
- scale_fill_manual(values = pal,
- guide = guide_bins(label.position = 'bottom',
- axis = FALSE,
- show.limits = TRUE,
- keywidth = unit(2, 'lines'),
- keyheight = unit(0.75, 'lines'),
- nrow = 1),
- na.value = 'grey95',
- name = '') +
-
- annotation_scale(location = "bl") + #添加比例尺
- annotation_north_arrow(location = "tl", which_north = "false",
- style = north_arrow_fancy_orienteering) + #添加指北针
-
- theme_minimal() +
- theme(legend.position = c(0.25, 0.1),
- legend.direction = 'horizontal',
- axis.title = element_blank(),
- plot.title = element_text(size = 22),
- plot.background = element_rect(fill = "white", color = "white"))
-
- ##2.市级地图
- ##数据在公众号玩蛇皮SnakeCharmer回复“教程数据”获取
- data = readxl::read_xls("./data/七普人口基本状况.xls")
- data %>%
- set_names(nm = names(data) %>% str_remove_all(" |\n")) %>%
- select(地区, 总人口)-> df
-
-
- china_city = read_sf("./data/china_map/2020/2020年地级/2020年地级.shp") %>%
- left_join(df, join_by(地名==地区)) %>%
- mutate(总人口=as.double(总人口)/10000,
- class = cut(总人口,
- breaks = c(0, 50, 100, 200, 300, 400, 500, 600, 1000, 1500, 2000, 3206)))
-
- ggplot() +
- geom_sf(data = china_city,
- aes(fill = class),
- linewidth=0.075, color = "#241E3E") +
- geom_sf(data = china_line, fill=NA, linewidth=0.5, color="#241E3E") +
- coord_sf(crs = "+proj=laea +lat_0=40 +lon_0=104") +
- scale_fill_manual(values = rev(brewer.pal(11, "Spectral")),
- name = "",
- na.value = "grey95") +
- annotation_scale(location = "bl") + #添加比例尺
- annotation_north_arrow(location = "tl", which_north = "false",
- style = north_arrow_fancy_orienteering) + #添加指北针
- theme_minimal() +
- theme(plot.background = element_rect(fill = "white", color = NA),
- legend.position = "bottom",
- legend.key.height = unit(2, "mm"))
- ##3.县级地图
- ##业务数据处理
- rec = "繁昌县=繁昌区;海门市=海门区;监利县=监利市;水城县=水城区;同仁县=同仁市;芜湖县=湾沚区;抚远市=抚远县;else=copy"
- data %>%
- set_names(nm = names(data) %>% str_remove_all(" |\n")) %>%
- filter(!(str_starts(地区, "表")),
- !is.na(地区),
- !(地区%in%c("地 区", "市辖区"))) %>%
- mutate(city = case_when(str_starts(地区, " ") ~ NA,
- 地区 %in% c("省直辖县级行政区划", "自治区直辖县级行政区划", "县") ~ "prov",
- .default = 地区)) %>%
- fill(city, .direction="down") %>%
- left_join(prov %>% select(name), join_by(city==name), keep = TRUE) %>%
- fill(name, .direction = "down") %>%
- filter(str_starts(地区, " ")) %>%
- left_join(prov, by="name") %>%
- mutate(地区 = str_remove_all(地区, " "),
- 地区 = case_when(地区=="市辖区" ~ city,
- .default = 地区),
- 地区 = rec(地区, rec=rec),
- city = if_else(city=="prov", name, city),
- 总人口 = round(as.double(总人口)/10000),
- class = cut(总人口,
- breaks = c(0, 1, 10, 20, 30, 40, 50, 75, 100, 300, 600, 1047),
- include.lowest = TRUE)) %>%
- rename(prov.name = name)-> df
-
-
- ##县级地图数据处理
- china_district = read_sf("./data/china_map/2020/2020年县级/2020年县级.shp") %>%
- mutate(city = if_else(地级类=="不统计", 省级, 地级)) %>%
- left_join(df, join_by(地名==地区, city==city), keep=TRUE)
-
- ##作图
- ggplot() +
- geom_sf(data = china_district,
- aes(fill = class),
- linewidth=0.075, color = "#241E3E") +
- geom_sf(data = china_line, fill=NA, linewidth=0.5, color="#241E3E") +
- coord_sf(crs = "+proj=laea +lat_0=40 +lon_0=104") +
- scale_fill_manual(values = rev(brewer.pal(11, "Spectral")),
- name = "",
- na.value = "grey95") +
- annotation_scale(location = "bl") + #添加比例尺
- annotation_north_arrow(location = "tl", which_north = "false",
- style = north_arrow_fancy_orienteering) + #添加指北针
- theme_minimal() +
- theme(plot.background = element_rect(fill = "white", color = NA),
- legend.position = "bottom",
- legend.key.height = unit(2, "mm"))