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
相关产品推荐
相关产品推荐

