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

在R中创建按数值着色的自定义扇形图形并添加显著性标记

实现自定义网格扇形图(带数值着色与显著性标记)

实现思路

通过R语言的ggplot2结合ggforce包绘制环形扇形,同时为数据添加几何参数与显著性标记,精准匹配你要求的直径比例、扇形划分与可视化需求。

完整代码实现

# 加载依赖包
library(tidyverse)
library(ggforce)

# 生成模拟数据(固定种子保证可复现)
set.seed(123)
sectors <- c("upper_outer", "right_outer", "left_outer", "lower_outer", 
             "upper_inner", "lower_inner", "left_inner", "right_inner", "centre")
values <- sample(1:20, 9)
p_values <- seq(0.01, 0.09, by = 0.01)
df <- data.frame(sector = sectors, value = values, p_values = p_values)

# 为每个扇形添加几何参数
df <- df %>%
  mutate(
    # 半径范围:对应直径比例1:3:6 → 半径0.5:1.5:3
    r_min = case_when(
      sector == "centre" ~ 0,
      str_detect(sector, "inner") ~ 0.5,
      str_detect(sector, "outer") ~ 1.5
    ),
    r_max = case_when(
      sector == "centre" ~ 0.5,
      str_detect(sector, "inner") ~ 1.5,
      str_detect(sector, "outer") ~ 3
    ),
    # 角度划分(0度为正右,顺时针方向)
    start_angle = case_when(
      sector %in% c("right_inner", "right_outer") ~ 0,
      sector %in% c("upper_inner", "upper_outer") ~ 90,
      sector %in% c("left_inner", "left_outer") ~ 180,
      sector %in% c("lower_inner", "lower_outer") ~ 270,
      sector == "centre" ~ 0
    ),
    end_angle = case_when(
      sector %in% c("right_inner", "right_outer") ~ 90,
      sector %in% c("upper_inner", "upper_outer") ~ 180,
      sector %in% c("left_inner", "left_outer") ~ 270,
      sector %in% c("lower_inner", "lower_outer") ~ 360,
      sector == "centre" ~ 360
    ),
    # 转换为弧度(ggforce要求用弧度计算角度)
    start_rad = start_angle * pi / 180,
    end_rad = end_angle * pi / 180,
    # 计算扇形中心角度,用于放置文本
    mid_rad = (start_rad + end_rad) / 2,
    # 文本放置的半径(扇形中间位置)
    text_r = (r_min + r_max) / 2,
    # 生成显著性标记:p<0.05加*
    sig = ifelse(p_values < 0.05, "*", "")
  )

# 绘制图形
ggplot(df) +
  # 绘制扇形,填充色绑定value值
  geom_arc_bar(
    aes(x0 = 0, y0 = 0, r0 = r_min, r = r_max, start = start_rad, end = end_rad, fill = value),
    color = "white" # 扇形间添加白色边界区分
  ) +
  # 添加数值与显著性标记
  geom_text(
    aes(x = text_r * cos(mid_rad), y = text_r * sin(mid_rad), 
        label = paste(value, sig, sep = "\n")),
    size = 4, color = "black"
  ) +
  # 设置色盲友好的填充色阶
  scale_fill_viridis_c(option = "plasma", name = "数值") +
  # 转换为极坐标
  coord_polar(start = 0) +
  # 清理主题,去掉冗余元素
  theme_void() +
  theme(
    legend.position = "right",
    legend.title = element_text(size = 12),
    legend.text = element_text(size = 10)
  )

关键细节说明

  • 半径比例:严格按照直径1:3:6设置半径范围,确保环形比例符合要求。
  • 角度划分:每个环形的4个扇形各占90度,中心为完整圆形,角度以正右为0点顺时针计算。
  • 显著性标记:通过ifelse判断p值,自动为p<0.05的数值添加*标记。
  • 文本放置:计算每个扇形的中心位置,确保数值和标记准确居中显示。

自定义调整建议

  • 若需要将0度设为正上方,可在coord_polar中添加start = -pi/2,同时对应调整start_angle和end_angle的数值。
  • 可替换scale_fill_viridis_c为scale_fill_gradient(low = "blue", high = "red")来自定义渐变颜色。
  • 调整geom_text的size参数可改变文本大小,color参数可修改文本颜色。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 11:01:24