如何用ggmagnify和ggplot2制作地图的放大嵌入图?
解决ggmagnify绘制德州放大嵌入图报错问题
问题场景
在Tidytuesday龙卷风数据集分析中,已完成美国基础地图绘制,尝试用ggmagnify包的geom_magnify添加德克萨斯州的放大嵌入图时,出现报错无法生成预期效果。
原报错代码
tornados_acrros_us + geom_magnify(from = us_geo_data %>% filter(abb == "TX"), to = c(-125, -98, 10, 30))
报错信息
Warning messages: 1: In min(from$x) : No missing arguments for min; Returning inf 2: In min(from$y) : No missing arguments for min; Returning inf 3: In max(from$x) : No missing arguments for max; Returning -inf 4: In max(from$y) : No missing arguments for max; Returning -inf 5: Removed 51 rows containing missing values (`geom_magnify()`).
报错原因
geom_magnify的from参数仅接受**坐标范围向量(xmin, xmax, ymin, ymax)**或包含x/y列的数据框,而传入的是sf格式地理数据(含geometry列),函数无法从中提取有效坐标范围,导致min/max计算异常,最终报错。
解决方案
步骤1:提取德州边界框坐标
用st_bbox()从德州的sf对象中提取边界框,转换为向量作为from参数:
tx_bbox <- st_bbox(us_geo_data %>% filter(abb == "TX")) %>% as.vector()
步骤2:调整放大图放置位置
修改to参数的坐标范围,确保放大图放在主地图空白区域(避免重叠):
tornados_acrros_us + geom_magnify(from = tx_bbox, to = c(-100, -85, 20, 35))
完整可运行代码
library(tidyverse) library(sf) library(maps) library(ggthemes) library(ggmagnify) # 读取数据集 tornados <- readr::read_csv('https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2023/2023-05-16/tornados.csv') # 构建州名与缩写映射 state_names_df <- tibble(state = state.name) %>% bind_cols(tibble(abb = state.abb)) %>% bind_rows(tibble(state = "District Of Columbia", abb = "DC")) %>% as.data.frame() # 获取美国州地理数据 maps_states_df <- st_as_sf(map("state", plot = FALSE, fill = TRUE)) %>% mutate(ID = str_to_title(ID)) us_geo_data <- state_names_df %>% left_join(maps_states_df, by = c("state" = "ID")) # 绘制基础美国地图 tornados_acrros_us <- ggplot(us_geo_data) + geom_sf(aes(geometry = geom), linewidth = 0.1) + geom_point(data = tornados %>% filter(!st %in% c("VI", "DC", "AK", "PR", "HI")), aes(x = slon, y = slat), size = 0.2, color = "darkgreen", alpha = 0.2) + ggthemes::theme_map() # 提取德州边界框并添加放大嵌入图 tx_bbox <- st_bbox(us_geo_data %>% filter(abb == "TX")) %>% as.vector() tornados_acrros_us + geom_magnify(from = tx_bbox, to = c(-100, -85, 20, 35))
效果说明
运行代码后,主地图下方偏右区域会显示德州的放大图,同时保留龙卷风点的可视化效果,实现预期的嵌入放大功能。
内容的提问来源于stack exchange,提问作者mzkrc
相关产品推荐
相关产品推荐

