UFO中文网

 找回密码
 注册会员
查看: 178|回复: 1
收起左侧

使用 R、sf 和 ggplot2 以编程方式绘制漂亮的地图

[复制链接]
online_member 发表于 2023-3-2 09:03:52 | 显示全部楼层 |阅读模式
本教程是三个系列中的第一部分:
1、世界地图(本文档)说明的一般概念
2、添加附加层:点和多边形的示例
3、复杂地图的定位和布局
在这一部分中,我们将介绍使用与 sf 关联的 ggplot2 进行制图的基础知识,并介绍我们可以用来准备地图的基本元素和参数。
地图用于各种领域,以吸引人的和解释性的方式表达数据。 数据可以用简化的模式表示,如果仅通过电子表格查看数据,这种数据解释通常会丢失。 地图可以通过将许多变量合并到易于阅读和适用的上下文中来添加重要的上下文。 地图在信息世界中也非常重要,因为它们可以快速让公众获得更好的洞察力,以便他们随时了解情况。 让地图有效至关重要,这意味着创建特定受众可以轻松理解的地图。 例如,需要让儿童理解的地图与打算向地理学家展示的地图会有很大不同。
了解增强数据所需的元素是制作有效地图的关键。 应考虑的地图基本元素是多边形、点、线和文本。 地图上的多边形是闭合的形状,例如国家边界。 线被认为是没有填充任何方面的线性形状,例如高速公路、溪流或道路。 最后,点用于指定特定位置,例如城市或地标位置。 考虑到这一点,需要考虑地图中需要哪些元素才能真正产生影响,并向目标受众传达信息。 布局和格式是视觉上增强数据的第二个关键方面。 可以调整这些地图元素的排列方式以及它们的绘制方式,以产生最大的影响。
使用 R 及其包生态系统的解决方案

当前创建地图的解决方案通常涉及 GIS 软件,例如 ArcGIS、QGIS、eSpatial 等,这些软件允许以与准备海报或文档布局相同的方法可视化地准备地图。 另一方面,R 是一种免费的开源软件开发环境 (IDE),用于以可编程语言计算统计数据和图形,多年来开发了先进的空间功能,可用于以编程方式绘制地图 .
R 是一个强大而灵活的工具。 R 可用于从计算数据集到使用相同数据集创建图形和地图。 R 也是免费的,这使得任何人都可以轻松访问它。 使用 R 的其他一些优势是它具有交互式语言、数据结构、图形可用性、发达的社区,以及通过整个包生态系统添加更多功能的优势。 R 是一种可编写脚本的语言,允许用户写出将执行指定命令的代码。
使用 R 创建地图可以为地图绘制带来这些好处。 可以轻松添加或删除地图的元素——可以调整 R 代码以通过按键进行重大改进。 为不同的数据集重现相同的地图也很容易。 能够编写地图元素的脚本很重要,这样它就可以被任何用户重复使用和解释。 从本质上讲,比较典型的 GIS 软件和 R 绘制地图类似于比较文字处理软件(例如 Microsoft Office 或 LibreOffice)和编程排版系统(如 LaTeX),因为典型的 GIS 软件实施 WYSIWIG 方法(“所见即所得” What You Get”),而 R 实现了 WYSIWYM 方法(“所见即所得”)。
ggplot2 包在 R 中实现了图形语法,作为一种创建对用户有意义的代码的方法:图形语法是一个术语,用于将图形分解为语义组件,例如几何和图层。 实际上,它允许(并强制!)用户关注更高抽象级别的图形元素,以及必须如何构建数据才能实现预期结果。 虽然 ggplot2 正在成为 R 图形的事实标准,但它并不专门处理空间数据。 R 中当前最先进的空间对象依赖于包 sp 中定义的空间类,但新包 sf 最近实现了“简单特征”标准,并且正在稳步接管 sp。 最近,包 ggplot2 允许使用包 sf 中的简单特征作为 graph1 中的层。 因此,ggplot2 和 sf 的结合使得能够使用图形语法以编程方式创建地图,就像传统 GIS 软件一样信息丰富或具有视觉吸引力。
入门

许多 R 包可从 CRAN(综合 R 存档网络)获得,它是 R 包的主要存储库。 可以安装本系列教程所需的完整软件包列表:
install.packages(c("cowplot", "googleway", "ggplot2", "ggrepel",
"ggspatial", "libwgeom", "sf", "rnaturalearth", "rnaturalearthdata")我们首先加载所有地图所需的基本包,即 ggplot2 和 sf。 我们还建议为 ggplot2 (theme_bw) 使用经典的 dark-on-light 主题,它适用于地图:
library("ggplot2")
theme_set(theme_bw())
library("sf")包 rnaturalearth 提供了整个世界国家的地图。 使用 ne_countries 提取国家/地区数据并选择比例(对于比例 =“大”,rnaturalearthhires 是必需的)。 该函数可以返回 sp 类(默认)或直接返回 sf 类,如参数 returnclass 中所定义:
library("rnaturalearth")
library("rnaturalearthdata")

world <- ne_countries(scale = "medium", returnclass = "sf")
class(world)

## [1] "sf"  
## [1] "data.frame"世界地图说明的一般概念

数据和基本图(ggplot 和 geom_sf)

首先,让我们开始使用 ggplot2 创建世界底图。 然后将使用不同的地图元素扩展此底图,并放大到感兴趣的区域。 我们可以检查世界地图是否已正确检索并转换为 sf 对象,并使用 ggplot2 绘制它:
ggplot(data = world) +
    geom_sf()
使用 R、sf 和 ggplot2 以编程方式绘制漂亮的地图6 / 作者:阿丽66 / 帖子ID:114463
此调用很好地介绍了 ggplot 调用的结构: 第一部分 ggplot(data = world) 启动 ggplot 图,并指示主要数据存储在 world 对象中。 该行以 + 号结尾,表示调用尚未完成,随后的每一行都对应于另一个层或尺度。 在这种情况下,我们使用 geom_sf 函数,它只是添加存储在 sf 对象中的几何图形。 默认情况下,所有几何函数都使用 ggplot() 中定义的主要数据,但稍后我们将看到如何提供附加数据。
请注意,层在 ggplot 调用中一次添加一个,因此每一层的顺序非常重要。 所有数据都必须是 sf 格式才能被 ggplot2 使用; 如有必要,其他格式的数据(例如来自 sp 的类)将被手动转换为 sf 类。
标题、副标题和轴标签(ggtitle、xlab、ylab)

可以使用函数 ggtitle 将标题和副标题添加到地图,将任何有效的字符串(例如带引号)作为参数传递。 默认情况下地图上没有坐标轴名称,但可以更改为更合适的名称(例如“经度”和“纬度”),具体取决于地图:
ggplot(data = world) +
    geom_sf() +
    xlab("Longitude") + ylab("Latitude") +
    ggtitle("World map", subtitle = paste0("(", length(unique(world$NAME)), " countries)"))
使用 R、sf 和 ggplot2 以编程方式绘制漂亮的地图180 / 作者:阿丽66 / 帖子ID:114463
地图颜色(geom_sf)

在许多方面,sf 几何与常规几何没有什么不同,并且可以在对其属性进行相同级别的控制的情况下显示。 下面是一个用绿色(参数填充)填充国家多边形的示例,使用黑色作为国家轮廓(参数颜色):
ggplot(data = world) +
    geom_sf(color = "black", fill = "lightgreen")
使用 R、sf 和 ggplot2 以编程方式绘制漂亮的地图942 / 作者:阿丽66 / 帖子ID:114463
ggplot2 包允许使用更复杂的配色方案,例如数据的一个变量上的渐变。 这是另一个显示每个国家/地区人口的示例。 在此示例中,我们使用“viridis”色盲友好调色板进行颜色渐变(plasma 变体的选项 =“plasma”),使用人口的平方根(存储在世界对象的变量 POP_EST 中 ):
ggplot(data = world) +
    geom_sf(aes(fill = pop_est)) +
    scale_fill_viridis_c(option = "plasma", trans = "sqrt")
使用 R、sf 和 ggplot2 以编程方式绘制漂亮的地图249 / 作者:阿丽66 / 帖子ID:114463
投影和范围 (coord_sf)

函数 coord_sf 允许处理坐标系,包括地图的投影和范围。 默认情况下,地图将使用定义一个的第一层的坐标系(即按提供的顺序扫描),或者如果没有,则退回到 WGS84(纬度/经度,GPS 中使用的参考系统)。 使用参数 crs,可以覆盖此设置,并动态投影到任何投影。 这可以使用任何有效的 PROJ4 字符串(此处为以欧洲为中心的 ETRS89 兰伯特方位角等积投影)来实现:
ggplot(data = world) +
    geom_sf() +
    coord_sf(crs = "+proj=laea +lat_0=52 +lon_0=10 +x_0=4321000 +y_0=3210000 +ellps=GRS80 +units=m +no_defs ")
使用 R、sf 和 ggplot2 以编程方式绘制漂亮的地图13 / 作者:阿丽66 / 帖子ID:114463
空间参考系统标识符 (SRID) 或欧洲石油调查组 (EPSG) 代码可用于感兴趣的投影,它们可以直接使用,而不是完整的 PROJ4 字符串。 以下两个调用等效于 ETRS89 兰伯特方位角等积投影,即 EPSG 代码 3035:
ggplot(data = world) +
    geom_sf() +
    coord_sf(crs = "+init=epsg:3035")

ggplot(data = world) +
    geom_sf() +
    coord_sf(crs = st_crs(3035))地图的范围也可以在 coord_sf 中设置,实际上允许在感兴趣的区域中“缩放”,由 x 轴 (xlim) 和 y 轴 (ylim) 上的限制提供。 请注意,限制会自动扩展一小部分,以确保数据和轴不重叠; 它也可以关闭以完全匹配 expand = FALSE 提供的限制:
ggplot(data = world) +
    geom_sf() +
    coord_sf(xlim = c(-102.15, -74.12), ylim = c(7.65, 33.97), expand = FALSE)
使用 R、sf 和 ggplot2 以编程方式绘制漂亮的地图853 / 作者:阿丽66 / 帖子ID:114463
比例尺和指北针(包 ggspatial)
有几个包可用于在地图上创建比例尺(例如 prettymapr、vcd、ggsn 或 legendMap)。 我们在这里介绍包 ggspatial,它提供易于使用的功能......
scale_bar 允许同时将北符号和比例尺添加到 ggplot 地图中。 需要手动设置五个参数:lon、lat、distance_lon、distance_lat 和 distance_legend。 必须在 lon 和 lat 参数中以经度/纬度指定比例尺的位置。 比例尺内的阴影距离由 distance_lon 参数控制。 而它的宽度由 distance_lat 决定。 此外,可以更改比例尺图例的字体大小(参数 legend_size,默认为 3)。 “N”北符号后面的指北针也可以调整其长度 (arrow_length)、与刻度的距离 (arrow_distance) 或 N 北符号本身的大小(arrow_north_size,默认为 6)。 注意所有的距离(distance_lon, distance_lat, distance_legend, arrow_length, arrow_distance)在distance_unit中默认设置为“km”; 它们也可以用“nm”设置为海里,或者用“mi”设置为英里。
library("ggspatial")
ggplot(data = world) +
    geom_sf() +
    annotation_scale(location = "bl", width_hint = 0.5) +
    annotation_north_arrow(location = "bl", which_north = "true",
        pad_x = unit(0.75, "in"), pad_y = unit(0.5, "in"),
        style = north_arrow_fancy_orienteering) +
    coord_sf(xlim = c(-102.15, -74.12), ylim = c(7.65, 33.97))

## Scale on map varies by more than 10%, scale bar may be inaccurate
使用 R、sf 和 ggplot2 以编程方式绘制漂亮的地图511 / 作者:阿丽66 / 帖子ID:114463
请注意比例尺不准确的警告:由于地图在等距圆柱投影(所有子午线平行)上使用经度/纬度 (WGS84) 的未投影数据,地图上的长度(千)米在数学上直接取决于度数 纬度。 小区域或投影数据的图通常会允许更准确的比例尺。
国家名称和其他名称(geom_text 和 annotate)

世界数据集已经包含国家名称和每个国家的质心坐标(以及更多信息)。 我们可以使用此信息绘制国家名称,使用世界作为 ggplot2 中的常规 data.frame。 函数 geom_text 可用于使用地理坐标向地图添加文本层。 该功能需要输入国家名称所需的数据,这与世界地图是相同的数据。 同样,我们有一个非常灵活的控件,可以在很多方面随意调整文本:
大小(参数大小);
对齐方式,默认情况下以提供的坐标为中心。 可以使用参数 hjust 和 vjust 水平或垂直调整文本,参数可以是 0(右/下)和 1(上/左)之间的数字或字符(“left”、“middle”、“right” 、“底部”、“中心”、“顶部”)。 文本也可以通过参数 nudge_x 和 nudge_y 水平或垂直偏移;
文本的字体,例如它的颜色(参数颜色)或字体类型(字体);
标签重叠,使用参数 check_overlap,删除重叠文本。 或者,当有很多重叠标签时,包 ggrepel 提供了一个 geom_text_repel 函数,可以移动标签,使它们不重叠。
对于文本标签,我们使用包 sf 中的 st_centroid 定义县的质心。 然后我们在空间数据框的几何结构中将坐标与质心结合起来。 包 sf 是命令 st_centroid 所必需的。
此外,注释函数可用于在特定位置添加单个字符串,如下所示添加墨西哥湾:
library("sf")
world_points<- st_centroid(world)
world_points <- cbind(world, st_coordinates(st_centroid(world$geometry)))

ggplot(data = world) +
geom_sf() +
geom_text(data= world_points,aes(x=X, y=Y, label=name),
    color = "darkblue", fontface = "bold", check_overlap = FALSE) +
annotate(geom = "text", x = -90, y = 26, label = "Gulf of Mexico",
    fontface = "italic", color = "grey22", size = 6) +
coord_sf(xlim = c(-102.15, -74.12), ylim = c(7.65, 33.97), expand = FALSE)
使用 R、sf 和 ggplot2 以编程方式绘制漂亮的地图421 / 作者:阿丽66 / 帖子ID:114463
最终地图

现在要做最后的润色,可以编辑地图的主题,使其更具吸引力。 我们建议将 theme_bw 用于标准主题,但还有许多其他主题可供选择(例如,参见 ggplot2 中的 ?ggtheme,或提供几个有用主题的包 ggthemes)。 此外,可以调整特定的主题元素以获得最终结果:
图例的位置:虽然在本例中没有使用,但参数 legend.position 允许自动将图例放置在特定位置(例如“topright”、“bottomleft”等);
地图上的网格线(经纬网):使用panel.grid.major 和panel.grid.minor 可以调整网格线。 这里我们将它们设置为灰色和虚线类型,以清楚地将它们与国家边界线区分开来;
地图背景:参数 panel.background 可用于为背景着色,背景本质上是海洋,浅蓝色;
可以调整主题的更多元素,此处无法涵盖。 我们建议读者参阅函数主题的文档。
ggplot(data = world) +
geom_sf(fill= “antiquewhite”) +
geom_text(data= world_points,aes(x=X, y=Y, label=name), color = “darkblue”, fontface = “bold”, check_overlap = FALSE) +
annotate(geom = “text”, x = -90, y = 26, label = “Gulf of Mexico”, fontface = “italic”, color = “grey22”, size = 6) +
annotation_scale(location = “bl”, width_hint = 0.5) +
annotation_north_arrow(location = “bl”, which_north = “true”, pad_x = unit(0.75, “in”), pad_y = unit(0.5, “in”), style = north_arrow_fancy_orienteering) +
coord_sf(xlim = c(-102.15, -74.12), ylim = c(7.65, 33.97), expand = FALSE) + xlab(“Longitude”) + ylab(“Latitude”) +
ggtitle(“Map of the Gulf of Mexico and the Caribbean Sea”) +
theme(panel.grid.major = element_line(color = gray(.5), linetype = “dashed”, size = 0.5), panel.background = element_rect(fill = “aliceblue”))
使用 R、sf 和 ggplot2 以编程方式绘制漂亮的地图348 / 作者:阿丽66 / 帖子ID:114463
使用 ggsave 保存地图

最终地图现已准备就绪,可以使用 ggsave 轻松保存它。 此功能允许以各种格式保存图形(通常是最后显示的图),包括最常见的 PNG(光栅位图)和 PDF(矢量图形),并控制结果的大小和分辨率。 例如,我们保存地图的 PDF 版本,以保持最佳质量,并保存 PNG 版本用于网络用途:
ggsave("map.pdf")
ggsave("map_web.png", width = 6, height = 6, dpi = "screen")注意:从最近在 CRAN 上发布的 ggplot2 版本 3.0.0 开始支持 sf 对象。
online_member 发表于 2023-3-2 09:04:34 | 显示全部楼层
看起来可以做地质图或者板块重建
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

UFO中文网

GMT+8, 2024-11-26 04:23

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表