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

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


地理可视化是数据分析中非常重要的一部分,它能帮助我们直观地呈现研究对象在空间维度上的分布情况。例如,某项全国性调查的受访者在中国境内的分布,或者具体某个亚组的研究对象分布情况(例如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语言代码的粉丝朋友们可以回复“制作中国地图”获得。如果屏幕前的你对数据分析和可视化还有什么问题或看法,欢迎内给我留言哦

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,192评论 6 511
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,858评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,517评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,148评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,162评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,905评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,537评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,439评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,956评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,083评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,218评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,899评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,565评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,093评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,201评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,539评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,215评论 2 358

推荐阅读更多精彩内容