空间数据可视化与 R 语言(上篇)

ggplot2
空间数据可视化
Author

Lee

Published

November 21, 2023

本文有几个写作意图:

  1. 如何用 R 语言调用各类地图服务实现各类空间数据的各种可视化方法。
  2. 以丰富的实例数据和图形展示各类空间数据,帮助读者建立直觉。
  3. 对比多个可视化 R 包,提供丰富的效果图,帮助读者选择合适的可视化图形。
  4. 希望在这个颜值走遍天下的时代,能吸引更多的人入坑 R 语言,并感受 R 语言在数据可视化领域的魅力。

1 空间数据

  1. 空间数据基本类型是多边形(点、线、面),还分矢量数据和栅格数据。
  2. 矢量数据是由点、线、面组成的,栅格数据是由像素点组成的。
  3. 矢量数据的优势是可以进行空间分析,栅格数据的优势是可以进行空间统计。
Tip

空间分析和空间统计是地理信息系统(GIS)和统计学领域中两个相关但有区别的概念。

  1. 空间分析:
  • 定义: 空间分析是一种研究地理现象在空间上分布、相互关系和影响的方法。它涉及到对地理数据的处理、分析和解释,以便更好地理解地理空间中的模式和趋势。
  • 目的: 主要目的是通过对地理数据进行空间操作和分析,揭示地理现象的模式、关联和趋势,从而支持决策制定和问题解决。
  1. 空间统计:
  • 定义: 空间统计是统计学的一个分支,专注于研究随机过程和变量在地理空间上的分布和变化。它关注地理现象的空间分布是否呈现出统计学上的显著性和模式。
  • 目的: 主要目的是通过统计方法来研究地理现象在空间上的分布,检测是否存在统计学上显著的空间模式,例如聚集、随机或分散。

总体来说,空间分析更广泛,包括对地理数据的处理、分析和可视化,旨在理解地理空间中的现象。而空间统计更专注于运用统计学的方法来研究空间上的模式和趋势。这两者通常结合使用,以全面理解地理现象在空间上的特征。

接下来我们陆续使用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 土地面积(单位:平方英里)。
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") # 图例位置图形下方

usmap 提供 plot_usmap()函数可谓专门用来绘制美国各州县的地图,包含夏威夷和阿拉斯加州,不包含波多黎各,参数data要传入一个数据框,且必须有一列可以和地图提供的区域名称映射上,即需要有一列的列名是statefips。实际上,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,深耕多年,功能全面,使用的体感是性能比较差。

  • 静态式地图包:choroplethrchoroplethrMaps主要用来制作地区分布图,choroplethrMaps包提供三份地图数据,分别是美国州、县地图和世界地图,相关介绍材料见这里tmap制作交互地图,mapsf制作符号地图、等值地图、拓扑地图,关于各类地图的可视化示例见AntV官网。mapsapi可以连接 4 种 Google 提供的 Web 地图服务。

echarts4r是也绘制交互式地图的R包,未来有兴趣可以再了解

References

Cheng, Joe, Bhaskar Karambelkar, and Yihui Xie. 2022. Leaflet: Create Interactive Web Maps with the JavaScript Leaflet Library. https://rstudio.github.io/leaflet/.
Sarkar, Deepayan. 2021. Lattice: Trellis Graphics for r. http://lattice.r-forge.r-project.org/.
Sievert, Carson, Chris Parmer, Toby Hocking, Scott Chamberlain, Karthik Ram, Marianne Corvellec, and Pedro Despouy. 2021. Plotly: Create Interactive Web Graphics via Plotly.js. https://CRAN.R-project.org/package=plotly.
Wickham, Hadley, Winston Chang, Lionel Henry, Thomas Lin Pedersen, Kohske Takahashi, Claus Wilke, Kara Woo, Hiroaki Yutani, and Dewey Dunnington. 2022. Ggplot2: Create Elegant Data Visualisations Using the Grammar of Graphics. https://CRAN.R-project.org/package=ggplot2.