geom_scatterpie图例优化:缩放饼图半径并显示实际样本量标签
解决方法
核心思路是:先对样本量n做缩放转换得到控制饼图半径的变量,再手动指定图例刻度标签,将缩放后的值映射回原始n值,既保证所有饼图可见,又让图例显示真实样本量。
步骤1:数据预处理
先对n做缩放(以0-1归一化为例,也可替换为对数转换):
library(ggplot2) library(scatterpie) library(dplyr) # 模拟带样本量的地图数据 set.seed(123) data <- tibble( lon = rnorm(10, 100, 5), lat = rnorm(10, 30, 5), n = sample(c(10, 50, 200, 500, 1000), 10, replace = TRUE), # 饼图分类数据 category1 = rnorm(10, 20, 5), category2 = rnorm(10, 30, 5) ) %>% # 将n归一化到0-1区间 mutate(n_scaled = (n - min(n)) / (max(n) - min(n)))
步骤2:绘制饼图并自定义图例
用缩放后的n_scaled控制半径,通过scale_size_continuous手动绑定缩放值与原始n的对应关系:
ggplot(data) + # 替换为你的实际地图底图图层 geom_blank(aes(x = lon, y = lat)) + geom_scatterpie( aes(x = lon, y = lat, r = n_scaled), cols = c("category1", "category2") ) + # 关键:自定义大小比例尺,让图例显示原始n值 scale_size_continuous( name = "样本量", breaks = unique(data$n_scaled), labels = unique(data$n), range = c(0.1, 1) # 限制饼图最小/最大尺寸,确保全部可见 ) + theme_minimal()
对数缩放适配
如果n方差极大,改用对数转换时,只需调整预处理和图例绑定逻辑:
data <- data %>% mutate(n_log = log1p(n)) # log1p避免n=0时出错 ggplot(data) + geom_blank(aes(x = lon, y = lat)) + geom_scatterpie( aes(x = lon, y = lat, r = n_log), cols = c("category1", "category2") ) + scale_size_continuous( name = "样本量", breaks = unique(data$n_log), labels = unique(data$n), range = c(0.1, 1) ) + theme_minimal()
多取值场景的灵活图例
若n取值过多,可手动选择关键断点(如最小值、中位数、最大值)优化图例可读性:
# 选取关键样本量对应的缩放值 key_n <- c(min(data$n), median(data$n), max(data$n)) key_n_scaled <- (key_n - min(data$n)) / (max(data$n) - min(data$n)) ggplot(data) + geom_blank(aes(x = lon, y = lat)) + geom_scatterpie( aes(x = lon, y = lat, r = n_scaled), cols = c("category1", "category2") ) + scale_size_continuous( name = "样本量", breaks = key_n_scaled, labels = key_n, range = c(0.1, 1) ) + theme_minimal()
内容的提问来源于stack exchange,提问作者Alex Krohn
相关产品推荐
相关产品推荐

