各位粉丝朋友们大家好!首先很抱歉这么久都未进行更新,因为博一一直在适应国外的新科研的生活,并跟随导师完成了很多科研项目,之后我将重新陆续进行更新的~各位读者朋友们有想了解的内容也可以给我留言哦~
地理可视化是数据分析中非常重要的一部分,它能帮助我们直观地呈现研究对象在空间维度上的分布情况。例如,某项全国性调查的受访者在中国境内的分布,或者具体某个亚组的研究对象分布情况(例如2020年某数据库的糖尿病人群分布情况)。本篇推文将演示如何使用R语言,基于2020年CHARLS数据库(中国健康与养老追踪调查),结合GIS(地理信息系统)的Shapefile数据,实现中国地图分级或数值填充,并叠加省级边界,绘制一幅研究对象分布图(需要本教程中所有原始数据的朋友可以联系我)。
1. 设置工作目录并加载所需包
和以往的R项目一样,我们首先需要设定工作目录并加载常用的R包,这些包涵盖了数据读取、处理和可视化等多方面功能。
# 0. 设置工作目录并加载常用包
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”等):
# 1. 读取 地级市 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数据,供后续叠加使用:
同样,如果省名也出现乱码问题,可以添加 options =
"ENCODING=GBK" 试试看。
province_map <- st_read("2020年初/省级/2020年省级.shp")
# 如果只需要“省名”和geometry这两列,可提取:
# province_map <- province_map[c("省名", "geometry")]
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进行可视化。下面的示例中:
对合并后的地市进行不同深浅的颜色填充。
叠加省级边界。
使用scale_fill_viridis_c()做渐变色。
使用theme_minimal()简化主题。
配置标题、图例等,并可选地使用coord_sf()保证地图比例正确。
# 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: 全哥的学习生涯"
) +
# 可选:调整坐标等
coord_sf()
# 查看绘制结果
print(p)
最终呈现出来的地图(如图1示例)将以不同的颜色深浅来表现某城市内研究对象的数量,省级边界也会明显标识,方便大家快速对比各地区之间的差异。
7. 保存图形
若你需要将地图插入到报告或PPT中,可以使用ggsave()来保存输出。指定图像的宽度、高度以及分辨率等参数,得到一张清晰度足够高的地图(或者使用我之前推荐的export包进行输出也可以):
# 6. 查看并保存图形
ggsave("china_population_map.png", p, width = 10, height = 8, dpi = 300)
这样,我们就完成了从数据读取到可视化出图的全部流程。最后,需要本研究的完整R语言代码的粉丝朋友们可以回复“制作中国地图”获得。如果屏幕前的你对数据分析和可视化还有什么问题或看法,欢迎内给我留言哦