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

