【R】用 ggplot2 绘制漂亮的分级统计地图
最近我一直尝试利用R绘制地图,我从网上找到了上百种不同的实现方法,然而其中却没有适用于我的数据的方法。最终,我从以下几个博客【1】中找到了灵感。我在整合这些资源的基础上,通过不断的试验和修正得到了一个较好地解决方案。这个方案就是本篇博文的主要内容。
本篇博文中展示了如何利用 ggplot2 来绘制分级统计地图,同时还介绍了如何更改图例、颜色等参数指标,以及如何导出图像文件。
数据预处理
绘制分级统计地图需要一些软件包,你最好确认你的电脑中已经安装并加载了它们。我们利用 maptools 库中的 readShapeSpatial() 函数来读取形状数据。形状数据是储存了经纬度等地图信息的空间向量数据。好消息是,你可以免费下载这些数据!比如,你可以在这个网站中【2】下载全球各个 国家的形状数据。
我的项目是对印度的数据进行绘图分析,所以我下载了印度的形状数据并将它们导入到 R 中。

我们所导入的形状数据是一个空间类型的数据,我们可以检查它的变量名来观测它包含哪些内容。比如我们可以输出各个邦的名称:

现在我们已经得到目标数据。接下来我将会编造一些数据,你也可以导入 csv 格式的数据或者从你估计的模型中提取数据。最重要的一点是,新导入的数据中 id 号码必须和形状数据中的 id 一致,因为我们等会要合并这两个数据集。

[译者注]此处代码有误,原数据的ID编码为1287-1321,所以“id=1:num.states”应改为“id=1286+(1:num.states)”。
现在我们需要整合形状数据和目标数据集。首先,我们利用 ggplot 中的 fortify() 函数将形状数据转换成数据框格式的数据。该函数可以根据特定的识别变量将数据转化成数据框格式。

[译者注]此处显示的 ID 数据与原数据集的 ID 数据不一致。
我们可以看到这是一个常见的数据框格式的数据,其中列向量包含了经纬度数据。
接下来我们根据 ID 数据合并两个数据集,并保证空间数据集中没有缺失值。更重要的是,我们需要根据变量 order 对数据集进行排序。

基础绘图
我们准备利用 ggplot()、geom_polygon() 和 coord_map() 函数来绘图。

高阶绘图
上一部分只是绘图的开始,我们还可以通过调整其他参数使图形变得更漂亮。首先,我们可以利用 ggmap() 库中的 theme_nothing() 来删除背景和网格线,同时还需要设置 legend 的参数绘制图例。当然,我们还可以更改图例和整个图像的标题。
接下来,我们将配色改为“YlGn”(从黄色到绿色过渡)。你可以通过 display.brewer.all() 函数来观察具体配色情况。
我们也可以利用 scales 库中的 pretty_breaks() 函数来获取最佳分割点。如果你不喜欢 pretty_breaks() 的方法,你还可以通过 scale_fill_gradient() 来实 现:scale_fill_gradient(name=”var”,limits=c(0,100),low=”white”,high=”red”)

其他参数:
如果你想要将数值表示为暗色而不是亮色,那么你们可以在 scale_fill_distiller() 中加入 trans=”reverse”。
如果你面对的是离散型变量,那么你应该采用 scale_fill_manual() 函数:

此外,你还可以将各个邦的名称也绘制到地图上。首先,你需要识别出每个邦名对应的经纬度数据。本文中,我们利用 aggregate() 函数计算每个州经纬度取值范围的均值并作为对应邦名的坐标。

虽然这张图看起来有点乱,但是通过其他设置它将变得非常有用。当然你还可以利用 geom_text() 在地图中添加一些重要的识别信息。
导出地图数据
最后,我们可以用两种方法导出地图数据。
方法一:利用 Cairo 来导出地图。(MAC需要安装 X11)
首先我们将图像保存到对象中,然后利用 ggsave() 将该对象转化成 png 文件。
方法二:利用 pdf() 函数将对象保存为 pdf 文件

参考资料:
【1】 http://www.kevjohnson.org/making-maps-in-r/ ;
http://blog.revolutionanalytics.com/2009/11/choropleth-challenge-result.html
【2】http://www.diva-gis.org/gdata
原文链接:
http://rforpublichealth.blogspot.de/2015/10/mapping-with-ggplot-create-nice.html
原文作者:Slawa Rokicki
翻译:Fibears
【R】用 ggplot2 绘制漂亮的分级统计地图的更多相关文章
- 利用R语言制作出漂亮的交互数据可视化
利用R语言制作出漂亮的交互数据可视化 利用R语言也可以制作出漂亮的交互数据可视化,下面和大家分享一些常用的交互可视化的R包. rCharts包 说起R语言的交互包,第一个想到的应该就是rCharts包 ...
- R语言 ggplot2包
R语言 ggplot2包的学习 分析数据要做的第一件事情,就是观察它.对于每个变量,哪些值是最常见的?值域是大是小?是否有异常观测? ggplot2图形之基本语法: ggplot2的核心理念是将 ...
- R语言ggplot2 简介
ggplot2是一个绘制可视化图形的R包,汲取了R语言基础绘图系统(graphics) 和l attice包的优点,摒弃了相关的缺点,创造出来的一套独立的绘图系统: ggplot2 有以下几个特点: ...
- C# 使用GDI+绘制漂亮的MenuStrip和ContextMenuStrip皮肤
通过上面的效果截图可以看到,重绘后的MenuStrip和ContextMenuStrip可以添加自己的LOGO信息,实现了类似OFFICE2007的菜单显示效果. .NET对菜单控件的绘制提供了一个抽 ...
- 使用echarts绘制漂亮的渐变键盘仪表盘
echarts官方示例和默认样式都比较难看,经过一顿捣鼓实现比较漂亮的渐变仪表盘. 第一步:设置轴线 将图表轴线.label.分割线.隐藏,只保留刻度,然后修改刻度样式达到最终效果.不过要注意的是ax ...
- R语言绘图:ggplot2绘制ROC
使用ggplot2包绘制ROC曲线 rocplot<- function(pred, truth, ...){ predob<- prediction(pred, truth) #打印AU ...
- R语言绘图:时间序列分析 ggplot2绘制ACF PACF
R语言真是博大精深 方法一 Acf(gold[,2], type = "correlation",lag.max = 100) Acf(gold[,2], type = " ...
- [R可视化]ggplot2库介绍及其实例
前言 ggplot是一个拥有一套完备语法且容易上手的绘图系统,在Python和R中都能引入并使用,在数据分析可视化领域拥有极为广泛的应用.本篇从R的角度介绍如何使用ggplot2包,首先给几个我觉得最 ...
- 网络/运维工程师visio2013模具图标 绘制漂亮的网络拓扑图 狮子XL工程师美学思想
visio2013狮子XL自定义运维模具下载: 链接:http://pan.baidu.com/s/1bo779Kz 密码:xh3s 狮子XL 的美学思想: 1,一次痛苦,一生幸福. 之前,在绘制网络 ...
随机推荐
- 转 HTTP协议 (四) 缓存
转自:http://www.cnblogs.com/TankXiao/archive/2012/11/28/2793365.html 缓存的概念 缓存这个东西真的是无处不在, 有浏览器端的缓存, 有服 ...
- Workflow_标准控件Wait_For_Flow和Contiune_Flow的用法(案例)
2014-06-04 Created By BaoXinjian
- PopupWindow的简单使用(结合RecyclerView)
Android弹窗: 在Android中弹出式菜单(以下称弹窗)是使用十分广泛一种菜单呈现的方式,弹窗为用户交互提供了便利.关于弹窗的实现大致有以下两种方式AlertDialog和PopupWindo ...
- 最短路径 - 迪杰斯特拉(Dijkstra)算法
对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,并且我们称路径上的第一个顶点为源点,最后一个顶点为终点.最短路径的算法主要有迪杰斯特拉(Dijkstra)算法和弗洛伊德(Floyd ...
- TCP/IP具体解释学习笔记--TCP数据流
1.TCP的交互数据流 (1)基本概念 所谓交互数据流,其对TCP而言,就是他们所产生的大多数的TCP报文段中所包括的数据不超过10个字节.比如聊天等telnet的软件的TCP数据流就属于TCP交互数 ...
- Java 异常模型综述
一. 异常的引入及基础 发现错误的理想时机是在编译阶段.也就是在你试图运行程序之前. 然而,编译期间编译器并不能找出全部的错误,余下的错误仅仅有在运行期才干发现和解决,这类错误就是 Throwable ...
- 依据经纬度返回地址的url -- GoogleMap
latlng=34,112">https://maps.googleapis.com/maps/api/geocode/xml? latlng=34,112
- java.lang.IllegalStateException: The specified child already has a parent. You must call removeView
java.lang.IllegalStateException: The specified child already has a parent. You must call removeVi ...
- 用javascript获得地址栏参数的两种方法
javascript获得地址栏参数. 方法1: <script language="JavaScript"> //取地址栏参数 <!-- function Req ...
- 【Android】3.7 UI控制功能
分类:C#.Android.VS2015.百度地图应用: 创建日期:2016-02-04 一.简介 简介:介绍开关手势功能和显示隐藏UI控件 详述: (1)地图操作开关:平移.缩放.双击放大.双指操作 ...