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

如何在R中按样本量缩放网格中的多个饼图?

按样本量缩放饼图网格的实现方案

步骤1:加载依赖包

首先需要加载数据处理和绘图的核心包,tidyverse用于数据整理和基础绘图,ggh4x用来实现面板大小的自定义缩放:

library(tidyverse)
library(ggh4x)

步骤2:整理数据格式

将原始的宽格式数据转换为ggplot适用的长格式,同时保留样本量信息并计算缩放比例:

# 转换为长格式数据
x_long <- x %>%
  pivot_longer(cols = starts_with("a"), names_to = "category", values_to = "count")

# 计算每个location的缩放比例(以最大样本量为基准)
x_scaled <- x %>%
  mutate(scale_size = samplesize / max(samplesize)) %>%
  select(location, scale_size)

# 合并缩放比例到长数据集中
x_long <- x_long %>%
  left_join(x_scaled, by = "location")

步骤3:绘制缩放饼图网格

使用ggplot绘制饼图,通过facet_wrap2实现按样本量缩放面板大小:

ggplot(x_long, aes(x = "", y = count, fill = category)) +
  # 绘制条形图,后续转为饼图
  geom_bar(stat = "identity", width = 1) +
  # 转换为极坐标,形成饼图形态
  coord_polar(theta = "y") +
  # 按location分面,根据scale_size调整面板宽高
  facet_wrap2(~location, scales = "free",
              panel.width = as.list(x_scaled$scale_size),
              panel.height = as.list(x_scaled$scale_size)) +
  # 调整主题,移除冗余元素
  theme_void() +
  theme(
    legend.position = "bottom",
    strip.text = element_text(size = 12, face = "bold")
  ) +
  labs(fill = "类别")

关键说明

  • 转换长格式是ggplot处理多类别数据的标准操作,确保每个类别都能被正确映射到饼图的扇区。
  • scale_size的计算逻辑是用每个位置的样本量除以最大样本量,这样最大的饼图占满面板,其他饼图按比例缩小。
  • facet_wrap2的panel.width和panel.height参数接受列表形式的比例值,这是实现不同面板大小缩放的核心,也是ggh4x包相对于基础facet_wrap的优势。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 02:15:01