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

US Map嵌入可缩放饼图:解决R语言可视化饼图过小问题

解决美国州内国家公园访客占比饼图嵌入地图过小的问题

针对你用usmap+tidyverse+scatterpie制作双年份对比图时遇到的饼图极小问题,核心调整点集中在饼图缩放参数、坐标适配和数据权重绑定三个方面,以下是具体解决方案和完整代码示例:

关键调整项

  • 放大pie_scale参数:scatterpie默认pie_scale值极小(通常<1),需根据地图尺寸手动放大到1-5区间,比如设为pie_scale = 3,可根据最终显示效果微调。
  • 绑定饼图半径到实际访客数据:用每个州的总访客数标准化后的值作为radius参数,让访客多的州饼图更大,既解决尺寸问题又符合数据逻辑。
  • 适配usmap的投影坐标:使用usmap::centroid()获取各州的投影坐标(而非经纬度),避免坐标转换导致的尺寸压缩。
  • 用patchwork实现双图并排+统一图例:替代基础布局工具,更简洁地控制图间距和图例位置。

修正后的完整代码示例

假设你的数据结构为包含state(州名)、year(年份)、park_name(公园名)、visitors(访客数)的数据框park_data:

library(usmap)
library(tidyverse)
library(scatterpie)
library(patchwork)

# 预处理数据:计算州内公园访客占比、总访客数,转换为usmap兼容的州缩写
park_summary <- park_data %>%
  group_by(year, state) %>%
  mutate(
    total_visitors = sum(visitors),
    visit_share = visitors / total_visitors
  ) %>%
  ungroup() %>%
  mutate(abbr = usmap::fips(state, to = "abbr"))

# 获取各州投影坐标,标准化总访客数作为饼图半径
state_centroids <- usmap::centroid("states", proj = usmap_crs()) %>%
  rename(abbr = full) %>%
  left_join(
    park_summary %>% distinct(abbr, total_visitors, year),
    by = "abbr"
  ) %>%
  mutate(radius = scales::rescale(total_visitors, to = c(0.5, 2)))

# 定义复用绘图函数
plot_year_map <- function(year_val) {
  year_data <- park_summary %>% filter(year == year_val)
  centroid_data <- state_centroids %>% filter(year == year_val)
  
  usmap::plot_usmap(regions = "states", fill = "#f0f0f0", color = "#333333") +
    geom_scatterpie(
      data = centroid_data,
      aes(x = x, y = y, group = abbr, r = radius),
      cols = unique(year_data$park_name),
      data = year_data,
      pie_scale = 3,  # 核心:放大饼图缩放比例
      color = "white"
    ) +
    labs(title = paste(year_val, "年美国国家公园访客占比")) +
    theme_void() +
    theme(plot.title = element_text(hjust = 0.5, size = 14))
}

# 生成两年份图并并排,合并图例
plot_1990 <- plot_year_map(1990)
plot_2023 <- plot_year_map(2023)

(plot_1990 + plot_2023) +
  plot_layout(guides = "collect") +
  plot_annotation(title = "1990 vs 2023 美国各州国家公园访客占比对比") &
  theme(legend.position = "bottom", legend.title = element_text(text = "国家公园"))

额外优化提示

  • 若饼图仍偏小,可继续增大pie_scale(比如4-5)或调整radius的标准化区间(比如to = c(1, 3))。
  • 过滤无公园数据的州,避免空饼图干扰显示。
  • 用scale_fill_manual(values = c("公园1" = "#xxx", ...))添加自定义公园配色。

内容的提问来源于stack exchange,提问作者Husker Hazel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 00:12:41