猎奇 | 记录如何用R绘制数据地图

前几天有小伙伴说他最近在做数据可视化的东西,然后话题讨论到如何在地图上做可视化。说到数据处理,很自然的会让我们程序猿想到用R来做,于是潘老师就顺便复习了一下R的基本知识,并且把这一次做数据地图的过程记录一下。

前期准备

首先说一说R里面最基本的知识。首先在电脑上要安装R语言的环境。

安装好环境之后,为了提高工作效率,我们一般选用RStudio进行创作。R环境和RStudio都是免费的工具,直接下载无需破解无需注册即可用。(土豪非要买专业版的RStudio请随意)

在R中,赋值运算符不是“=”,而是“<-”,倒也很好理解,把右边的值给左边的变量。

在RStudio的脚本编辑窗口中,点击右上角的run,执行的是光标所在的这一行,如果想执行多行请用光标选中多行后再“run”。新建一个脚本,在窗口栏中“File”-“New File”-“R Script”即可。

绘制地图

基本知识就这些,下面潘老师要开始绘制数据地图了。因为在地图上画点画柱状图什么的太低级了(用Excel自带的就能做),所以这次用R画一个分区按值填色的地图。

1

首先到网上找一个世界地图的shapefile文件,这个文件包含了所有国家的边界信息,在染色时可以根据国家数值来给不同国家的形状染色。下载之后把里面的文件全部解压出来,找一个文件夹放在里面。

2

需要使用ArcGIS系列软件中的ArcCatalog打开后缀名为.shp的文件,进行一些准备工作。首先点击Connect To Folder的图标(图中位置),选择存放.shp文件的文件夹。

3

在左边选中shp文件,在右边选项卡选择“Preview”,在下面的选项栏中选择“Table”,在表格信息中,找到国家名字和他的列名,在这个文件里面国家名称存储在NAME_LONG列中。

4

将我们手里的数据表修改修改。国家名和NAME_LONG中的国家名保持一致,列名也改成NAME_LONG。

5

把数据存储成.csv文件。

6

运行R代码,在右边可以预览结果,可以点击国家查看数值,可以选择导出为HTML文件或者是图片,完成。(代码附在后面)

7

如果报错“pandoc.exe: Out of memory”,手动进入缓存文件夹去拿HTML文件即可。

8

HTML文件保留有不失真缩放和交互功能。

相关链接

世界地图shapefile下载:http://www.naturalearthdata.com/downloads/10m-cultural-vectors/10m-admin-0-countries/

arcgis10.2如何导出属性表:https://jingyan.baidu.com/article/14bd256e6e3a4cbb6d261205.html

R语言在线地图神器:Leafletfor R包(二)基础底图:http://blog.csdn.net/allenlu2008/article/details/52823492

源代码

#安装所需的包,安装执行过一次之后就可以把这两行注释掉了
#号为单行注释符
install.packages("leaflet")
install.packages("rgdal")
#加载包
library(leaflet) 
library(rgdal) 
#在指定路径里读取shp文件,path里输入存放路径
path <- "C:/Users/ASUSFX50J/Desktop/RWorldMap" 
fn <- list.files(path, pattern=".shp", full.names=FALSE) 
fn <- gsub(".shp", "", fn) 
maps <- readOGR(path, fn) 
#读取csv数据表
value <- read.csv("C:/Users/ASUSFX50J/Desktop/RWorldMap/OriginalData.csv", header = TRUE) 
#以NAME_LONG为基准将两个表的数据进行连接,csv里没有的国家在对应项置为空
shape <- merge(maps, value, by = "NAME_LONG") 
#交互式地图点击弹出信息
i_popup <- paste0("<strong>Country: </strong>", shape$NAME_LONG, "<br>", "<strong>Value: </strong>", shape$VALUE) 
#三种上色模式,任选一种即可
pal <- colorBin(c("darkred", "orangered" ,"yellow", "darkgreen", "blue"), shape$VALUE, 11)
#pal <- colorQuantile("YlOrRd", NULL, n = 5) 
#pal <- colorNumeric(c("darkred", "orangered" ,"yellow", "darkgreen", "darkblue"), shape$VALUE)
#绘制图像
leaflet(shape) %>% addTiles() %>% 
  #下面这一行,通过修改引号内可以获得炫酷的地图背景
  addProviderTiles("Esri.WorldStreetMap") %>%
  setView(0.000000, 0.000000, zoom = 2) %>% 
  addPolygons(color = ~pal(shape$VALUE), fillOpacity = 0.8, weight = 1, popup = i_popup) %>% 
#显示图例
  addLegend(pal = pal, values = shape$VALUE, position = "bottomright", title = "Data Map")