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

如何为R中ggplot2绘制的分面饼图添加百分比标签

解决分面饼图添加百分比标签的问题

嘿,我来帮你搞定这个百分比标签的难题!你的基础分面饼图已经做得不错了,之前加标签失败主要是因为直接在geom_text里用动态计算的比例很难准确定位。咱们换个思路,先提前把每个分组的百分比和标签位置算好,再画图就轻松多了。

步骤1:预处理数据计算百分比和标签位置

首先用dplyr来统计每个进展组(rapid/slow)里不同基因的样本数,然后算出各自的百分比,同时计算每个扇形的中间位置(这样标签能刚好放在扇形中心):

library(ggplot2)
library(dplyr)

# 统计每个分组的数量、百分比,以及标签的y轴位置
pie_summary <- pie %>%
  # 按进展类型和基因分组计数
  group_by(progression, Gene) %>%
  summarise(count = n(), .groups = "drop") %>%
  # 再按进展类型分组,计算百分比和中间位置
  group_by(progression) %>%
  mutate(
    percent = count / sum(count),
    y_pos = cumsum(percent) - percent / 2  # 累计比例减去一半,得到扇形中间点
  )

步骤2:绘制带标签的分面饼图

用预处理好的汇总数据来画图,geom_bar用stat="identity"直接使用计算好的百分比,然后用geom_text把标签放在预设的y_pos位置:

ggplot(pie_summary, aes(x = factor(1), y = percent, fill = Gene)) +
  # 绘制饼图的条形(转换为极坐标后就是扇形)
  geom_bar(stat = "identity", width = 1) +
  # 添加百分比标签,自动格式化为百分比格式
  geom_text(aes(y = y_pos, label = scales::percent(percent)), size = 3) +
  # 按进展类型分面
  facet_grid(. ~ progression) +
  # 转换为极坐标,变成饼图
  coord_polar("y") +
  # y轴显示百分比
  scale_y_continuous(labels = scales::percent_format()) +
  # 去掉冗余的x轴元素,让饼图更美观
  theme(
    axis.title.x = element_blank(),
    axis.text.x = element_blank(),
    axis.ticks.x = element_blank()
  )

为什么这个方法更可靠?

之前你用stat(count/sum(count))的方式,虽然能画出饼图,但geom_text很难动态计算每个扇形的中间位置——因为sum(count)在分面里的范围不好控制。提前预处理数据,我们能明确每个分组的百分比和标签位置,避免了动态统计的不确定性,标签位置也会更准确。

这样画出来的图,每个分面里的百分比都是基于该组的总样本数(rapid组19人,slow组12人),完全符合你的需求哦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 07:02:35