dxy logo
首页丁香园病例库全部版块
搜索
登录

如何用R语言制作中国地图(研究对象分布图)

发布于 02-17 · 浏览 2527 · IP 澳大利亚澳大利亚
iconWOrange 推荐

各位粉丝朋友们大家好!首先很抱歉这么久都未进行更新,因为博一一直在适应国外的新科研的生活,并跟随导师完成了很多科研项目,之后我将重新陆续进行更新的~

 

地理可视化是数据分析中非常重要的一部分,它能帮助我们直观地呈现研究对象在空间维度上的分布情况。例如,某项全国性调查的受访者在中国境内的分布,或者具体某个亚组的研究对象分布情况(例如2020年某数据库的糖尿病人群分布情况)。本篇推文将演示如何使用R语言,基于2020年CHARLS数据库(中国健康与养老追踪调查),结合GIS(地理信息系统)的Shapefile数据,实现中国地图分级或数值填充,并叠加省级边界,绘制一幅研究对象分布图(需要本教程中所有原始数据的粉丝朋友可以与我联系)。

1. 设置工作目录并加载所需包

和以往的R项目一样,我们首先需要设定工作目录并加载常用的R包,这些包涵盖了数据读取、处理和可视化等多方面功能。

# 设置工作目录并加载常用包

setwd("此处设置你自己的路径")

library(readr)

library(dplyr)

library(sf)

library(ggplot2)

library(viridis)   # 提供漂亮的颜色渐变

library(cowplot)   # 可选,若需要更美观的主题

library(ggspatial)  # 可选,若需要在地图上添加比例尺等元素


  • sf:R中处理空间数据(如Shapefile)的重要包。
  • readr:导入CSV等文件。
  • dplyr:数据清洗、分组汇总。
  • ggplot2:可视化核心包。
  • viridis:为地图或其他可视化提供渐变配色方案。
  • cowplot、ggspatial:辅助增强地图的展示效果。


2. 读取地级市 Shapefile

在正式绘图之前,我们要先读取地级市的Shapefile数据。Shapefile是地理信息系统中常用的矢量数据格式,里面包含了区域边界、地名等信息。下面的代码将载入“2020年初”地级市的边界数据,并简要查看列名(可能是“区划码”“地名”“geometry”等):

 # 读取 地级市 Shapefile

china_city_map <- st_read("2020年初/地级/T2020年初地级.shp")


# 查看列名以确认“地名”、“区划码”准确名称

names(china_city_map)


# 根据需要只选取这几列,地名/区划码/geometry

china_city_map <- china_city_map[c("区划码", "地名", "geometry")]


如果读取后发现地名乱码,可以在 st_read() 中增加编码选项,如:

 china_city_map <- st_read(

 "2020年初/地级/T2020年初地级.shp", 

 options = "ENCODING=GBK")


3. 读取省级 Shapefile(叠加省界)

为了在地图上更清晰地分辨省级边界,可以再读取一份省级的Shapefile数据,供后续叠加使用:

province_map <- st_read("2020年初/省级/2020年省级.shp")


# 如果只需要“省名”和geometry这两列,可提取:

# province_map <- province_map[c("省名", "geometry")]


同样,如果省名也出现乱码问题,可以添加 options = "ENCODING=GBK" 试试看。

 

4. 读取并处理研究对象人口数据

名为final_data.csv的外部数据文件即为CHARLS 2020年的研究对象人口信息,里面记录了各个城市的研究对象信息。我们将在这里示例如何对该数据进行聚合处理,然后再与地理数据进行合并。

 # 3. 读取并处理人口数据

data <- read_csv("final_data.csv")

# 如果文件是GBK/GB18030编码,可使用:

# data <- read_csv("final_data.csv", locale = locale(encoding = "GB18030"))


# 假设每行对应一个研究对象,给每个对象加一个计数 x=1

data$x <- 1


# 按 city 分组统计总人数(或其他指标)

data_city <- data %>%

 group_by(city) %>%

 summarise(value = sum(x))


在这里,data_city最终得到两列:城市名称city和在该城市出现的研究对象人数value。请确保与地图数据中“地名”的匹配一致,如“北京市”和“北京”若不同,需要在读入前做相应的清洗或替换。

 

5. 合并地图与统计数据

地图数据(china_city_map)包含几何信息和地名,统计数据(data_city)包含城市名和人数。我们用地名作为连接键,把这两份数据“拼”在一起:

 # 4. 合并地图与数据

china_city_map2 <- china_city_map %>%

 left_join(data_city, by = c("地名" = "city"))

合并成功后,china_city_map2会多出一个名为value的数值列,用来表示每个地级市的研究对象人数。若某些城市无数据,则对应NA。

 

6. 绘制中国地级市分布图,并叠加省级边界

一切准备就绪后,我们可以使用ggplot2进行可视化。下面的示例中:

 # 5. 绘制以地级市为单位的人口分布图,并叠加省级边界

p <- ggplot() +

 # (1) 地市填充

 geom_sf(data = china_city_map2, aes(fill = value), color = NA) +

 # (2) 省级边界,描一个黑色线

 geom_sf(data = province_map, fill = NA, color = "black", size = 0.4) +

 # (3) 颜色渐变 scale

 scale_fill_viridis_c(option = "magma", direction = -1, na.value = "grey90") +

 # (4) 设置主题

 theme_minimal() +

 # (5) 标题和图例

 labs(

  fill = "Numbers of participants",     # 图例标题

  title = "2020 CHARLS Prefecture-Level City Distribution Map of Study Participants",

  subtitle = "Author: Yuquan Chen"

 ) +

 # 可选:调整坐标等

 coord_sf()


# 查看绘制结果

print(p)


对合并后的地市进行不同深浅的颜色填充。

叠加省级边界。

使用scale_fill_viridis_c()做渐变色。

使用theme_minimal()简化主题。

配置标题、图例等,并可选地使用coord_sf()保证地图比例正确。

 

img

最终呈现出来的地图(如图1示例)将以不同的颜色深浅来表现某城市内研究对象的数量,省级边界也会明显标识,方便大家快速对比各地区之间的差异。

 

7. 保存图形

若你需要将地图插入到报告或PPT中,可以使用ggsave()来保存输出。指定图像的宽度、高度以及分辨率等参数,得到一张清晰度足够高的地图(或者使用我之前推荐的export包进行输出也可以):

 # 6. 查看并保存图形

ggsave("china_population_map.png", p, width = 10, height = 8, dpi = 300)

这样,我们就完成了从数据读取到可视化出图的全部流程。如果屏幕前的你对数据分析和可视化还有什么问题或看法,欢迎给我留言哦~

最后编辑于 02-17 · 浏览 2527

8 10 7

全部讨论0

默认最新
avatar
8
分享帖子
share-weibo分享到微博
share-weibo分享到微信
认证
返回顶部