在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
相关产品推荐
相关产品推荐

