概述
很久没有写教程案例了,因为很久没有学新的技术了。今天写一个最新做的案例,在一个paper中我们要展示某个数据在全国城市的分布的变化,原来的可视化方案是展示4个年份的地图facet,效果不是很好。最终决定使用动画地图的方案。
本文使用的所有技术全部来自Robin Lovelace, Jakub Nowosad, Jannes Muenchow的著作Geocomputation with R。
https://geocompr.robinlovelace.net/adv-map.html#animated-mapsgeocompr.robinlovelace.net- 读入数据并认知数据结构
我们是用的中国地图数据是一个geojson格式,使用geojsonsf包(比sf读geojson更快更稳定更灵活)读入数据。
# install.packages('geojsonsf')
library(geojsonsf)
city <- geojson_sf('chinacity.geojson')
我们先来看下读入的city是一个什么数据结构(从数据科学家的角度来看,理解了一个问题的充分必要条件是理解其数据结构)。city看上去就是一个dataframe,除了geometry这列有所不同,其他都是普通的列向量(被称作特征)。实际上,我们确实可以用dplyr对city进行各种操作。
那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.htmlcran.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
作图效果如下
配色参考:
https://www.nceas.ucsb.edu/~frazier/RSpatialGuides/colorPaletteCheatsheet.pdfwww.nceas.ucsb.edu4. 动画化
在画动画地图之前,我们需要了解分片操作,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
效果如下
进阶内容:互动地图以及map application
我就不写了,暂时用不到,哈哈哈!
最后
以上就是安静篮球为你收集整理的地图上制作线路的动画_R制作动画地图的全部内容,希望文章能够帮你解决地图上制作线路的动画_R制作动画地图所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复