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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 02:39:54