空间地理数据可视化之 ggplot2 包及其拓展
点击下方公众号,回复资料分享,收获惊喜
前言
上次
R
可视乎主要讲述了
《Geospatial Health Data》[1]
一书中关于
空间地理数据可视化
用
R
包制作地图的基础内容,参见
R可视乎|空间地理数据可视化(1)
。本篇将继续介绍空间地理数据可视化的
R
包和函数。
众所周知,地图对于传达地理空间信息非常有用,我们将介绍一些简单的例子,展示一些在
R
语言中常用于制图的包,即
ggplot2
、
tmap
、
leaflet
和
mapview
等。
本篇将主要介绍
ggplot2
包及函数的用法以及它的拓展(
gganimate
和
plotly
包)。
1. 基本画图设置
ggplot2[2]
是一个基于图形语法来创建图形的包,因此我们可以使用
ggplot()
函数和以下元素创建一个图:
- 想要可视化的数据;
-
指定数据的几何形状,如点或条。形状是用
geom_*()
函数指定的,例如,geom_point()
用于表示点,geom_histogram()
用于表示柱状图; -
几何对象的美化,如颜色、大小等。其中,
aes()
用于将数据中的变量映射为对象的视觉属性; - 可选的元素,如标尺、标题、标签、图例和主题等。
我们可以使用
geom_sf()
函数和一个简单特征对象(
sf
类)来创建地图。如果可用的数据是
SpatialPolygonsDataFrame
类的空间对象,可以用
sf
包的
st_as_sf()
函数轻松地将其转换为
sf
类的简单特征对象。
例子 :创建一个 1974 年北卡罗来纳州婴儿猝死的地图,如下所示(其中 map 数据可在上篇公众号( R可视乎|空间地理数据可视化(1) )第 4 部分 图形文件 中找到相关代码):
library(ggplot2)
map <- st_as_sf(map)
ggplot(map) + geom_sf(aes(fill = SID74)) + theme_bw()
1974 年北卡罗来纳州婴儿猝死的地图
2. 更多设置
-
在
ggplot()
中,离散变量的默认色标是scale_*_hue()
,这里*
表示颜色
(为点和线等特征着色)或填充
(为多边形或柱状图着色); -
scale_*_grey()
用来改变灰色颜色的默认比例,scale_*_distiller()
、scale_*_brewer()
使用 RColorBrewer 包的颜色(Neuwirth 2014),scale_*_viridis
使用 viridis 包的颜色(Garnier 2018); -
可用
scale_*_manual()
手动定义我们自己的颜色集,此函数有一个逻辑参数叫drop
,用来决定是否在尺度中保留不常用的因子水平; -
连续变量的颜色刻度可以用
scale_*_gradient()
来指定,它在两种颜色(低-高)之间创建一个连续的梯度,scale_*_gradient2()
创建一个发散的颜色梯度(低-中-高),scale_*_gradientn()
创建一个 n 种颜色的梯度。
如果你是 可视化的 R 小白 ,推荐你看一下庄小编的 ggplot 可视化教程 ,课件如下: R分享|自制112页可视化课件 。在公众号回复: 可视化文稿 即可免费获得,对应的视频教程见 b站 。
下图是用
viridis
包中的
scale_*_distiller()
函数和
ggplot()
函数绘制的 1974 年北卡罗来纳州婴儿猝死的地图:
例子 :
library(viridis)
map <- st_as_sf(map)
ggplot(map) + geom_sf(aes(fill = SID74)) +
scale_fill_viridis() + theme_bw()
viridis 和 ggplot2 创建的 1974 年北卡罗来纳州婴儿猝死的地图
3. 图像保存
要保存用
ggplot2
绘制的图,我们可以使用
ggsave()
函数。另外,我们也可以通过指定一个设备驱动(如
png
、
pdf
)来保存绘图,打印绘图,然后用
dev.off()
关闭设备。
ggsave("plot.jpg")
ggplot(map) + geom_sf(aes(fill = SID74)) +
scale_fill_viridis() + theme_bw()
png("plot1.png")
ggplot(map) + geom_sf(aes(fill = SID74)) +
scale_fill_viridis() + theme_bw()
dev.off()
4. 内容扩展
gganimate 包[3] 和 plotly 包[4] 可以与 ggplot2 包结合使用,分别创建动画和交互式绘图。
4.1 gganimate 包
一个典型的例子是使用
gapminder
数据集创建的动画,其中
transition_time()
是核心函数,添加动态。
例子 :
library(ggplot2)
library(gganimate)
library(gapminder)
head(gapminder)
我们使用
gapminder
数据集做一个简单的例子,前 6 行数据如下所示:
前 6 行数据
接下来我们根据不同情况进行数据可视化。
以年份的形式进行动画演示 :
theme_set(theme_bw())
p <- ggplot(gapminder,
aes(x = gdpPercap, y=lifeExp, size = pop, colour = country)) +
geom_point(show.legend = FALSE, alpha = 0.7) +
scale_color_viridis_d() +
scale_size(range = c(2, 12)) +
scale_x_log10() +
labs(x = "GDP per capita", y = "Life expectancy")
p + transition_time(year) + labs(title = "Year: {frame_time}")
用
gapminder
数据集创建的动画
将数据点作为背景 :
加入参数
shadow_mark(alpha = 0.3, size = 0.5)
,使得数据点作为动画演示的背景。
p + transition_time(year) +
labs(title = "Year: {frame_time}") +
shadow_mark(alpha = 0.3, size = 0.5)
将数据点作为背景后的动画
按大陆创建分面 :
使用
facet_wrap(~continent)
,创造分面。
p + facet_wrap(~continent) +
transition_time(year) +
labs(title = "Year: {frame_time}")
按大陆创建分面后的动画
4.2 plotly 包
R
的
plotly
包是一个基于浏览器的交互式图表库,它建立在开源的
JavaScript
图表库
plotly.js
之上。它通过
HTML widgets
框架完全在本地上运行,把结果上传到
plotly
账户,可以查看交互图及相应的数据,并进行修改。
plotly
与
ggplot2
结合,可创建交互式地图,实现放大、缩小、移动等操作。
例子1 :
我们还是使用原来那个地图作为例子,这时候使用
ggplotly()
将其转化为一个可交互的图形。
library(plotly)
library(ggplot2)
library(viridis)
library(sf)
map <- st_as_sf(map)
p2 <- ggplot(map) + geom_sf(aes(fill = SID74)) +
scale_fill_viridis() + theme_bw()
ggplotly(p2)