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

如何在R语言饼图指定位置添加比例检验显著性geom_text标签

实现带显著性标签的定制饼图

没问题!我会帮你完成从比例显著性检验到饼图标签添加的全流程,完全匹配你的需求。下面是分步的代码和说明:

第一步:先搞定显著性检验

首先我们需要针对每个condition(x/y/z)里的a、b比例做二项检验,算出p值后转换成常用的显著性标记(比如ns、*、**这类):

library(tidyverse)
library(scales) # 用来格式化百分比标签

# 你的原始数据
df <- data.frame( 
  condition = c('x', 'y', 'z'), 
  cat = rep(c('a', 'b'), 3), 
  freq = c(60, 34, 44, 40, 66, 56) 
)

# 分组做检验并生成显著性标签
sig_summary <- df %>%
  group_by(condition) %>%
  summarise(
    total_count = sum(freq),
    a_count = freq[cat == 'a'],
    # 二项检验:检验a的比例是否和预期有差异
    p_val = binom.test(a_count, total_count)$p.value,
    # 自定义显著性标记规则,你可以按需修改
    sig_label = case_when(
      p_val < 0.001 ~ '***',
      p_val < 0.01 ~ '**',
      p_val < 0.05 ~ '*',
      TRUE ~ 'ns'
    )
  )

# 把检验结果合并回原始数据
df_combined <- df %>% left_join(sig_summary, by = "condition")

第二步:绘制带标签的饼图

接下来用ggplot2绘制饼图,同时把显著性标签放在你想要的特定位置。这里默认放在每个饼图的外侧(类似手绘效果图的布局),如果需要调整位置可以看后面的自定义说明:

ggplot(df_combined, aes(x = "", y = freq, fill = cat)) +
  # 先画柱状图,再转成饼图
  geom_col(width = 1, color = "white") +
  coord_polar("y", start = 0) +
  # 给饼块内部添加百分比标签
  geom_text(aes(label = percent(freq / sum(freq))),
            position = position_stack(vjust = 0.5), size = 4) +
  # 添加显著性标签到饼图外侧
  geom_text(data = sig_summary,
            aes(x = 1.5, y = 0, label = sig_label),
            size = 6, fontface = "bold", color = "black") +
  # 按condition分面,每个组一个饼图
  facet_wrap(~condition) +
  # 清理主题,去掉多余的坐标轴等元素
  theme_void() +
  theme(
    legend.position = "bottom",
    strip.text = element_text(size = 12, face = "bold"),
    legend.title = element_text(face = "bold")
  ) +
  labs(fill = "Category")

自定义标签位置小技巧

如果你的手绘图里标签不是统一在右侧,而是要放在某个特定饼块旁边,可以通过调整坐标精准控制:

  • 在极坐标里,x控制标签离中心的距离(数值越大越靠外),y控制角度(0是正上方,顺时针递增)
  • 比如要给x组的a块旁边加标签,可以单独用annotate指定:
annotate("text", x = 1.2, y = 30, label = "*", size = 6, fontface = "bold")

补充说明

  • 这里用的是二项检验,适合二分类(a/b)的比例检验;如果你的需求是其他类型的检验,直接替换binom.test为对应的函数即可(比如卡方检验)
  • 显著性标记的阈值可以根据你的研究需求修改,比如调整case_when里的p值 cutoff
  • 如果需要更精准的标签位置,可以先计算每个饼块的角度范围,再对应设置y坐标

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:50:17