R语言画个中国地图使用shp文件
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_data
和shp_data
进行关联。
也很简单,再仔细看一下,show_data
就这几个城市,我们将这几个城市和shp_data
关联就可以;具体如下:(下面的代码是不完全正确)
my_data <- dplyr::left_join(show_data, shp_data,by = c("城市" = "NL_NAME_2"))
在你进行上面的代码运行的时候,你会发现一个问题,就是show_data
的城市
变量是字符串型,而shp_data
的NL_NAME_2
是因子型,你要将shp_data
的NL_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文件相关推荐
- 学习路之gis--如何获取中国地图的shp文件(含省级
1.下载地图json文件 网址:DataV.GeoAtlas地理小工具系列 http://datav.aliyun.com/tools/atlas/index.html 2.点击下载文件 也可以用ge ...
- 中国地图的shp文件获取,包含省级
1.下载地图json文件 网址:http://datav.aliyun.com/portal/school/atlas/area_selector http://datav.aliyun.com/to ...
- python是中国的吗-使用Python实现画一个中国地图
为什么是Python 先来聊聊为什么做数据分析一定要用Python或R语言.编程语言这么多种,Java, PHP都很成熟,但是为什么在最近热火的数据分析领域,很多人选择用Python语言? 数据分析只 ...
- 知道经纬度用python画路线图_神级程序员教你用Python如何画一个中国地图!(好好玩)...
为什么是Python 先来聊聊为什么做数据分析一定要用 Python 或 R 语言.编程语言这么多种, Java , PHP 都很成熟,但是为什么在最近热火的数据分析领域,很多人选择用 Python ...
- 如何用Python画一个中国地图?
为什么是Python? 先来聊聊为什么做数据分析一定要用Python或R语言.编程语言这么多种,Java, PHP都很成熟,但是为什么在最近热火的数据分析领域,很多人选择用Python语言? 数据分析 ...
- python中国地图程序设计_神级程序员教你用Python如何画一个中国地图!(好好玩)...
为什么是Python 先来聊聊为什么做数据分析一定要用 Python 或 R 语言.编程语言这么多种, Java , PHP 都很成熟,但是为什么在最近热火的数据分析领域,很多人选择用 Python ...
- 用Python画一个中国地图
为什么是Python 先来聊聊为什么做数据分析一定要用 Python 或 R 语言.编程语言这么多种, Java , PHP 都很成熟,但是为什么在最近热火的数据分析领域,很多人选择用 Python ...
- 如何用python画出中国地图-用Python画中国地图(二)
在上一篇文章<用Python画一个中国地图>中,我们简单描述了一下如何用Python快速画出一个中国地图的轮廓,似乎没有什么实用价值,这一次我们用实际数据填充它,使它看上去更有意义. 上色 ...
- 代码写好了怎么在php里裕兴_8 行代码用Python画一个中国地图
源 / SegmentFault Jupyter 首先,第一神器是Jupyter.如果你是第一次使用,可能搞不清楚它的开发者做这么个鬼东西出来干什么,说它是博客系统也不像,说它是web服务器也不像,但 ...
最新文章
- PHP之高性能I/O框架:Libevent(二)
- C# 导出EXCEL文件
- 九度 1462:两船载物问题(01背包)
- 当今 计算机已进入千家万户英语,学生英语教学论文,关于信息技术在大学英语教学中的应用探析相关参考文献资料-免费论文范文...
- Linux 系统应用编程——网络编程(socket编程)
- C++ new和malloc的区别
- 江苏单招试题计算机原理及答案,江苏省对口单招计算机组装与维修计算机原理考题分类汇总.docx...
- I2C总线串行串行输入输出结构
- 回想四叉树LOD地形(上)
- Html 5/CSS 的学习(二) —— Bootstrap 导航栏
- 软件设计师历年真题及答案2009-2017
- ECharts模拟百度迁徙实例
- 液压外部测试系统软件,液压测试系统的软件设计
- python实现 模糊C均值聚类算法(Fuzzy-C-Means)-基于iris数据集
- 利用selenium实现中国裁判文书网自动登录批量下载功能
- php中where条件whereRaw,「laravel whereRaw 和 where(DB::raw(''))」- 海风纷飞Blog
- 中科创达C++ 二面(hr面,30min,offer)
- Linux之USB无线网卡开发(二)
- 6轴机器人运动学(正解)
- 什么是BSP? 概念解析