library(tidyverse)
library(ggmap)
# maps包地图数据转换为data.frame数据类型
states_map <- map_data(map = "state")
# 准备观测数
df_state_1 <- state.x77 |>
as.data.frame() |>
mutate(region = tolower(rownames(state.x77))) |>
select(region, everything())
# 将观测数据与地图数据合并排序
states_map <- states_map |>
left_join(df_state_1, by = "region") |>
select(region, everything()) |>
arrange(order)
# 制图
ggplot(states_map, aes(long, lat, group = group)) +
geom_polygon(aes(group = group, fill = Population)) +
scale_fill_binned(
type = "viridis",
guide = guide_colorbar(
barwidth = 25, barheight = 0.4,
title.position = "top" # 图例标题位于图例上方
)
) +
coord_map(projection = "albers", lat0 = 45.5, lat1 = 29.5) +
labs(x = "Longitude", y = "Latitude", fill = "State Population (1975)") +
theme_void() +
theme(legend.position = "bottom") # 图例位置图形下方
本文有几个写作意图:
- 如何用 R 语言调用各类地图服务实现各类空间数据的各种可视化方法。
- 以丰富的实例数据和图形展示各类空间数据,帮助读者建立直觉。
- 对比多个可视化 R 包,提供丰富的效果图,帮助读者选择合适的可视化图形。
- 希望在这个颜值走遍天下的时代,能吸引更多的人入坑 R 语言,并感受 R 语言在数据可视化领域的魅力。
1 空间数据
- 空间数据基本类型是多边形(点、线、面),还分矢量数据和栅格数据。
- 矢量数据是由点、线、面组成的,栅格数据是由像素点组成的。
- 矢量数据的优势是可以进行空间分析,栅格数据的优势是可以进行空间统计。
空间分析和空间统计是地理信息系统(GIS)和统计学领域中两个相关但有区别的概念。
- 空间分析:
- 定义: 空间分析是一种研究地理现象在空间上分布、相互关系和影响的方法。它涉及到对地理数据的处理、分析和解释,以便更好地理解地理空间中的模式和趋势。
- 目的: 主要目的是通过对地理数据进行空间操作和分析,揭示地理现象的模式、关联和趋势,从而支持决策制定和问题解决。
- 空间统计:
- 定义: 空间统计是统计学的一个分支,专注于研究随机过程和变量在地理空间上的分布和变化。它关注地理现象的空间分布是否呈现出统计学上的显著性和模式。
- 目的: 主要目的是通过统计方法来研究地理现象在空间上的分布,检测是否存在统计学上显著的空间模式,例如聚集、随机或分散。
总体来说,空间分析更广泛,包括对地理数据的处理、分析和可视化,旨在理解地理空间中的现象。而空间统计更专注于运用统计学的方法来研究空间上的模式和趋势。这两者通常结合使用,以全面理解地理现象在空间上的特征。
接下来我们陆续使用lattice
(Sarkar 2021)、ggplot2
(Wickham et al. 2022)和leaflet
(Cheng, Karambelkar, and Xie 2022)三个包来绘制静态和交互式的空间数据图形。
1.1 实例1:人口普查统计数据
ggplot2 提供的 map_data()
函数可以从 maps 包中提取和转化地图数据,而 coord_map()
函数结合 mapproj 包可以实现坐标转化。下面以 R 内置的数据集state.x77
为例,它记录了美国 1977 年 50 个州的人口普查情况:
- Population 各州的人口数量 (1975 年 7 月 1 日估计)
- Income 人均收入(1974 年)
- Illiteracy 文盲比例(人口百分比)
- 平均寿命(1969-1971 年统计)
- Murder 谋杀和非过失杀人率(单位:十万分之一,1976 年统计)
- HS Grad 高中毕业生百分比(1970 年统计)
- Frost 首都或大城市最低气温低于冰点的平均天数(1931-1960 年统计)
- Area 土地面积(单位:平方英里)。
usmap 提供 plot_usmap()
函数可谓专门用来绘制美国各州县的地图,包含夏威夷和阿拉斯加州,不包含波多黎各,参数data要传入一个数据框,且必须有一列可以和地图提供的区域名称映射上,即需要有一列的列名是state
或fips
。实际上,usmap包还内置有区县级地图数据,也支持抽取特定的州县,更多介绍见这里。
library(usmap)
df_state_2 <- state.x77 |>
as.data.frame() |>
mutate(state = tolower(rownames(state.x77))) |>
select(state, everything())
plot_usmap(data = df_state_2, values = "Population", labels = TRUE) +
scale_fill_gradientn(
colours = hcl.colors(10), na.value = "grey90",
guide = guide_colorbar(
barwidth = 25, barheight = 0.4,
title.position = "top"
)
) +
theme(legend.position = "bottom")
2 相关可视化包
本节主要介绍几个R语言社区提供的地理可视化R包,分别是绘制交互式地图和绘制静态地图的:
交互式地图包:常见的有leaflet(Cheng, Karambelkar, and Xie (2022))包和plotly(Sievert et al. (2021))包。它们各有千秋leaflet专注于交互式地理可视化,支持常见的矢量和栅格数据对象。plotly背后的支持来自商业公司,上游依赖是开源的JavaScript库plotly,深耕多年,功能全面,使用的体感是性能比较差。
静态式地图包:choroplethr和choroplethrMaps主要用来制作地区分布图,choroplethrMaps包提供三份地图数据,分别是美国州、县地图和世界地图,相关介绍材料见这里。tmap制作交互地图,mapsf制作符号地图、等值地图、拓扑地图,关于各类地图的可视化示例见AntV官网。mapsapi可以连接 4 种 Google 提供的 Web 地图服务。