地图上制作线路的动画_R制作动画地图

b11d3b6070e497fc3c80b69f540fe4a3.png

很久没有写教程案例了,因为很久没有学新的技术了。今天写一个最新做的案例,在一个paper中我们要展示某个数据在全国城市的分布的变化,原来的可视化方案是展示4个年份的地图facet,效果不是很好。最终决定使用动画地图的方案。

本文使用的所有技术全部来自Robin Lovelace, Jakub Nowosad, Jannes Muenchow的著作Geocomputation with R。

https://geocompr.robinlovelace.net/adv-map.html#animated-maps​geocompr.robinlovelace.net
  1. 读入数据并认知数据结构

我们是用的中国地图数据是一个geojson格式,使用geojsonsf包(比sf读geojson更快更稳定更灵活)读入数据。

# install.packages('geojsonsf')
library(geojsonsf)
city <- geojson_sf('chinacity.geojson')

我们先来看下读入的city是一个什么数据结构(从数据科学家的角度来看,理解了一个问题的充分必要条件是理解其数据结构)。city看上去就是一个dataframe,除了geometry这列有所不同,其他都是普通的列向量(被称作特征)。实际上,我们确实可以用dplyr对city进行各种操作。

764ede3715a8c148b3c34f97408f9148.png

那geometry是什么东西呢?让我们输出一个结果看看。它是一个地理信息系统vector(与一般的vector同名不同义,另一个数据类型是raster,不展开),代表了城市代码110000(北京市)的地理边界。其类型是MULTIPOLYGON,即多个多边形组成的vector。一个多边形储存的方式就是一堆顶点的二维坐标构成的一个list,加下面最后一行,第一个点的经纬度是(116.6319 41.05877)。

city$geometry[1]

输出为:
Geometry set for 1 feature 
geometry type:  MULTIPOLYGON
dimension:      XY
bbox:           xmin: 115.413 ymin: 39.44117 xmax: 117.507 ymax: 41.05901
epsg (SRID):    4326
proj4string:    +proj=longlat +datum=WGS84 +no_defs
MULTIPOLYGON (((116.6319 41.05877, 116.6328 41....

2. 将特征加入geo data frame

当我们揭开神秘地理数据结构的面纱之后,接下来的操作就是平凡的了。

首先,在初级应用中,我们不需要修改geometry列,所有的工作只是根据特征来可视化;

那么,接下来要做的事情就是加入我们要画图的特征。

# 要用于可视化的特征数据组,读入之后要进行一些清理,此处略去
entry <- read.csv("entry.csv") 
city_final <- left_join(city, entry, by = c("citycode","year")
# 我们加入的特征向量为num,是panel,year代表年份
# 需要注意的是,要把data frame 转换成sf对象
city_final <- st_sf(city_final) 

3. 画地图

接下来,我们使用tmap包进行地图可视化,其语法与ggplot2类似(都是grammar of graphics),都属于图层式的。建议先花15分钟学习教程:

https://cran.r-project.org/web/packages/tmap/vignettes/tmap-getstarted.html​cran.r-project.org
# 由于我们画的num是一个连续变量,因此需要定义一个切分(也可以使用style参数来调节自动切分)
pb <- c(0,300,1000,2000,4000,8000,15000,20000,30000,80000,300000)
# 取其中一年作为静态作图的数据
tmp <- city_final %>% filter(year == 2016)
# 使用tmp画静态地图
tm_shape(tmp) + 
        tm_polygons("num", colorNA = NULL, palette = 'Blues', breaks = pb)
# 其中 tm_shape 相当于 ggplot(tmp)指定作图对象,tm_polygons 类似于ggline 之类的,告诉R要画多边形
# 与ggplot2语法不同的是,直接使用列名称“num”来制定填充对象
# palette 规定配色方案,breaks 规定连续变量num的分组标准
# 还可以用title参数规定图例的title

作图效果如下

e5f2673804f7568d67bf19c980fa7c30.png

配色参考:

https://www.nceas.ucsb.edu/~frazier/RSpatialGuides/colorPaletteCheatsheet.pdf​www.nceas.ucsb.edu

4. 动画化

在画动画地图之前,我们需要了解分片操作,tm_facets 的作用是指定一列作为分组标准,例如使用year 分组,相当于每一年做一张地图。

动画的效果便是同一个位置,连续的将facet的地图呈现出来,我们使用tmap_animation来实现,代码如下:

facet_anim <- tm_shape(tmp) + 
        tm_polygons("num", colorNA = NULL, palette = 'Oranges', breaks = pb,title="Number") +
        tm_facets(free.scales.fill = FALSE, nrow = 1, ncol = 1, along = "year") +
        tm_layout(legend.position = c("left", "bottom"))
tmap_animation(tm = facet_anim, filename = "chinaexample.gif", width = 1600)
# 注意在geocomputation with R作者提供的code中没有指定width参数,会产生error

效果如下

bb20b7a2ebaecc4296eee5c91499ce21.gif

进阶内容:互动地图以及map application


我就不写了,暂时用不到,哈哈哈!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值