You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 11:22:43