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

在R中绘制带绝对计数的PieDonut嵌套饼图报错求助

问题排查与解决方案

错误原因

showRatioPie参数仅接受逻辑值(TRUE/FALSE),用于控制是否显示饼图的比例标签,并非用来指定显示“绝对计数”的参数。传入字符串"absolute"会导致函数在执行逻辑判断时失败,从而抛出argument is not interpretable as logical错误。

解决方案

要同时显示饼图(外层)的百分比与绝对计数,需自定义标签函数结合统计数据实现。具体步骤如下:

1. 统计分类计数

先计算每个Class对应的观测数量,用于后续标签生成:

class_counts <- data[, .N, by = Class]
count_map <- setNames(class_counts$N, class_counts$Class)

2. 自定义标签函数

编写函数将百分比与绝对数合并为标签内容:

custom_pie_label <- function(a, r) {
  absolute <- round(a * nrow(data))  # 通过比例计算绝对数
  paste0(scales::percent(a), "\n(n=", absolute, ")")
}

3. 调用PieDonut生成图表

开启饼图比例标签显示,并传入自定义标签函数:

PieDonut(data, aes(Class, Gene), 
         showRatioPie = TRUE, 
         labelPie = custom_pie_label,
         showRatioDonut = function(a,r) scales::scientific(a))

完整可运行代码

library(ggpie)
library(data.table)

# 加载数据集
data <- structure(list(Class = c("ADTKD", "ADTKD", "Ciliopathy", "Cystic", 
"ADTKD", "Ciliopathy", "ADTKD", "Cystic", "ADTKD", "Systemic", 
"Glomerulopathy", "Collagenopathy", "Tubulopathy", "Systemic", 
"Ciliopathy", "Collagenopathy", "Glomerulopathy", "Cystic", "Tubulopathy", 
"Glomerulopathy", "Collagenopathy", "CAKUT", "Tubulopathy", "ADTKD", 
"Collagenopathy", "Collagenopathy", "CAKUT", "Ciliopathy", "Glomerulopathy", 
"Ciliopathy", "CAKUT", "Collagenopathy", "Cystic", "Collagenopathy", 
"Glomerulopathy", "ADTKD", "Collagenopathy", "CAKUT"), Gene = c("REN", 
"UMOD", "NPHP1", "OFD1", "UMOD", "NPHP1", "UMOD", "TSC2;PKD1", 
"UMOD", "EVC", "LMX1B", "COL4A4", "CLDN16", "GLA", "NPHP4", "COL4A4", 
"INF2", "PKD2", "CLDN16", "INF2", "COL4A4", "SALL1", "CLCN5", 
"UMOD", "COL4A4", "COL4A5", "PPP1R12A", "NPHP1", "TRIM8", "NPHP3", 
"17q12", "COL4A5", "PKD1", "COL4A3", "SMARCAL1", "UMOD", "COL4A5", 
"PAX2")), row.names = c(NA, -38L), class = c("data.table", "data.frame"
))

# 统计分类计数
class_counts <- data[, .N, by = Class]
count_map <- setNames(class_counts$N, class_counts$Class)

# 自定义饼图标签函数
custom_pie_label <- function(a, r) {
  absolute <- round(a * nrow(data))
  paste0(scales::percent(a), "\n(n=", absolute, ")")
}

# 绘制嵌套饼图
PieDonut(data, aes(Class, Gene), 
         showRatioPie = TRUE, 
         labelPie = custom_pie_label,
         showRatioDonut = function(a,r) scales::scientific(a))

关键说明

  • showRatioPie=TRUE用于启用饼图标签,labelPie参数替换默认的百分比显示逻辑。
  • 绝对数可通过a * nrow(data)计算(a为当前分类的比例值),也可直接使用预统计的count_map匹配分类名称获取。
  • 环形图(Donut)的标签保留原代码的科学计数格式设置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 00:02:40