R语言画个中国地图,使用shp文件

前几天帮人用R语言画个一个河北省的地图,河北省各个市被填充上颜色,颜色的深浅和这个市的GDP有关系,效果如下:

然后加上各个城市的名字并加上指北针、再把背景的网格去掉,效果如下:

那么如何做的??

library(rgdal)
library(ggplot2)
library(maptools)
library(mapproj)
library(ggsn)

当然你还要安装sf包,这个包非常重要,用ggplot2画地图必不可少。还要安装readxl包,这个包是用来读取excel表格的(可以读取xlsx,或者xls表格)。

show_data <- readxl::read_xlsx("河北省各市GDP增长率.xlsx")

show_data数据框包含河北省各个地方的GDP,这个数据长得是这样的:

shp_data <- sf::st_read("./CHN_adm/CHN_adm2.shp")

这个数据是地理信息数据,从CHN_adm文件夹里面读取的,长成这样的:

仔细看一下shp_data里面有两个变量要注意,geometry是包含各个市的地理信息位置,没有这一列,ggplot2就不会画地图,NL_NAME_2是各个市的中文名字。

接下来就是将show_datashp_data进行关联。

也很简单,再仔细看一下,show_data就这几个城市,我们将这几个城市和shp_data关联就可以;具体如下:(下面的代码是不完全正确)

my_data <- dplyr::left_join(show_data, shp_data,by = c("城市" = "NL_NAME_2"))


在你进行上面的代码运行的时候,你会发现一个问题,就是show_data城市变量是字符串型,而shp_dataNL_NAME_2是因子型,你要将shp_dataNL_NAME_2转换成字符串型。然后再合并,不然就会有下面的错误:

所以正确的转换如下:(其实转换不转换也都一样,效果上是一样的,但是没有了警告。这样不是很完美么。

shp_data$NL_NAME_2 <- as.character(shp_data$NL_NAME_2)
my_data <- dplyr::left_join(show_data, shp_data,by = c("城市" = "NL_NAME_2"))

dplyr::left_join的意思是使用dplyr包的left_join函数。这样就不用加载完全加载这个包了。left_join意思是做连接,按照左边的表进行关联,这样不管你右边的表有多少行,最后只是根据你左边的数据框,也就是show_data,合并规则就是by = c("城市" = "NL_NAME_2")按照,左边的数据框的城市和右边数据框的NL_NAME_2,这两列进行比较。(这个我写的比较浅,可以看一下别人写的介绍,多用一用就熟悉了。
my_data长得就是下面的样子:

现在画图的数据已经准备好了,开始画图。

ggplot(data = my_data)   geom_sf(aes(fill = `GDP生产总值`))

很多人直接使用这样的代码,其实我刚开始也是,但是效果不理想(出现错误,其实大部分都是可以的,我也不知道怎么回事,错误如下:

> ggplot(data = my_data)   geom_sf(aes(fill = `GDP生产总值`))
错误: stat_sf requires the following missing aesthetics: geometry

这个意思就是说你要指定my_data数据里面的那一列是地理信息数据,很明显,就是geometry这一列:
把代码改成如下就可以了:

ggplot(data = my_data)   geom_sf(aes(fill = `GDP生产总值`, geometry = `geometry`))

图就出现了(是不是很简单):

但是很多人不认识哪一个区域叫什么市,所以要给区域加标签,因为刚开始做的比较着急,没想到使用sf的一些神奇的函数,我就自己观察上面的图,然后自己找坐标,通过geom_text来加标签,现在回头看,好傻!!!
先把我当时写的代码放出来:

label_city <- data.frame(x = c(114.5,118,115,119.2,118.3,116.5,115,116.8,115.8, 114.9, 114.5),y = c(38,41,41,40,40,39.3,39,38, 37.9, 37.2, 36.5))
label_city['city'] <- my_data$城市
#
# [1] "石家庄市" "承德市"   "张家口市" "秦皇岛市" "唐山市"   "廊坊市"   "保定市"
# [8] "沧州市"   "衡水市"   "邢台市"   "邯郸市"
ggplot(data = my_data)   geom_sf(aes(fill = `GDP生产总值`, geometry = `geometry`))  geom_text(data = label_city, aes(x = x, y = y, label = city), color = 'red')

画出来的图如下:

其实也可以,但是当城市比较多的时候,就不行了,因为我不可能一个一个去查城市的坐标是多少。

改进后的代码如下:

library(sf)
ggplot(data = my_data)   geom_sf(aes(fill = `GDP生产总值`, geometry = `geometry`))   geom_sf_text(aes(label = `城市`,geometry = `geometry`), color = 'red')

那么这些地理信息图从哪里来的呢?

上面的那个地理信息文件夹内容如下:

其实都在gadm2这个网站上,网站如下:https://gadm.org/
可以免费下载:

另外我已经将我的代码和数据上传到github上了,欢迎下载使用,有问题可以联系我:yuanzhoulvpi@outlook.com

github: **https://github.com/yuanzhoulvpi2017/plot_data/tree/master/hebei_province_gdp

R语言画个中国地图使用shp文件相关推荐

  1. 学习路之gis--如何获取中国地图的shp文件(含省级

    1.下载地图json文件 网址:DataV.GeoAtlas地理小工具系列 http://datav.aliyun.com/tools/atlas/index.html 2.点击下载文件 也可以用ge ...

  2. 中国地图的shp文件获取,包含省级

    1.下载地图json文件 网址:http://datav.aliyun.com/portal/school/atlas/area_selector http://datav.aliyun.com/to ...

  3. python是中国的吗-使用Python实现画一个中国地图

    为什么是Python 先来聊聊为什么做数据分析一定要用Python或R语言.编程语言这么多种,Java, PHP都很成熟,但是为什么在最近热火的数据分析领域,很多人选择用Python语言? 数据分析只 ...

  4. 知道经纬度用python画路线图_神级程序员教你用Python如何画一个中国地图!(好好玩)...

    为什么是Python 先来聊聊为什么做数据分析一定要用 Python 或 R 语言.编程语言这么多种, Java , PHP 都很成熟,但是为什么在最近热火的数据分析领域,很多人选择用 Python ...

  5. 如何用Python画一个中国地图?

    为什么是Python? 先来聊聊为什么做数据分析一定要用Python或R语言.编程语言这么多种,Java, PHP都很成熟,但是为什么在最近热火的数据分析领域,很多人选择用Python语言? 数据分析 ...

  6. python中国地图程序设计_神级程序员教你用Python如何画一个中国地图!(好好玩)...

    为什么是Python 先来聊聊为什么做数据分析一定要用 Python 或 R 语言.编程语言这么多种, Java , PHP 都很成熟,但是为什么在最近热火的数据分析领域,很多人选择用 Python ...

  7. 用Python画一个中国地图

    为什么是Python 先来聊聊为什么做数据分析一定要用 Python 或 R 语言.编程语言这么多种, Java , PHP 都很成熟,但是为什么在最近热火的数据分析领域,很多人选择用 Python ...

  8. 如何用python画出中国地图-用Python画中国地图(二)

    在上一篇文章<用Python画一个中国地图>中,我们简单描述了一下如何用Python快速画出一个中国地图的轮廓,似乎没有什么实用价值,这一次我们用实际数据填充它,使它看上去更有意义. 上色 ...

  9. 代码写好了怎么在php里裕兴_8 行代码用Python画一个中国地图

    源 / SegmentFault Jupyter 首先,第一神器是Jupyter.如果你是第一次使用,可能搞不清楚它的开发者做这么个鬼东西出来干什么,说它是博客系统也不像,说它是web服务器也不像,但 ...

最新文章

  1. PHP之高性能I/O框架:Libevent(二)
  2. C# 导出EXCEL文件
  3. 九度 1462:两船载物问题(01背包)
  4. 当今 计算机已进入千家万户英语,学生英语教学论文,关于信息技术在大学英语教学中的应用探析相关参考文献资料-免费论文范文...
  5. Linux 系统应用编程——网络编程(socket编程)
  6. C++ new和malloc的区别
  7. 江苏单招试题计算机原理及答案,江苏省对口单招计算机组装与维修计算机原理考题分类汇总.docx...
  8. I2C总线串行串行输入输出结构
  9. 回想四叉树LOD地形(上)
  10. Html 5/CSS 的学习(二) —— Bootstrap 导航栏
  11. 软件设计师历年真题及答案2009-2017
  12. ECharts模拟百度迁徙实例
  13. 液压外部测试系统软件,液压测试系统的软件设计
  14. python实现 模糊C均值聚类算法(Fuzzy-C-Means)-基于iris数据集
  15. 利用selenium实现中国裁判文书网自动登录批量下载功能
  16. php中where条件whereRaw,「laravel whereRaw 和 where(DB::raw(''))」- 海风纷飞Blog
  17. 中科创达C++ 二面(hr面,30min,offer)
  18. Linux之USB无线网卡开发(二)
  19. 6轴机器人运动学(正解)
  20. 什么是BSP? 概念解析

热门文章

  1. 浅析Python中signal包的使用
  2. 南理工硕士论文latex模板
  3. 随机的UserAgent对付某反爬虫网站
  4. Android OKHttp 可能你从来没用过的拦截器 【实用推荐】
  5. 群辉NAS+为知笔记docker定制私有云笔记
  6. 用Python自动生成Excel数据报表!
  7. linux中touch命令如何使用,一天一个shell命令 linux文本操作系列-touch命令用法
  8. 程序员为程序员推荐:我觉得这本书不错,分享给你
  9. atcoder abc242 c题 1111gal password
  10. 数据分析的心法、手法和利器