如何在R的ggplot中为分组条形图添加水平标题/标签
ggplot绘制带分组标签水平线的分组条形图模板
以下是符合需求的绘图模板,可实现“每组3个条形+带标签分组水平线”的效果:
步骤1:准备数据与加载依赖包
首先加载tidyverse包(包含ggplot2和数据处理工具),并构造符合结构的示例数据:
library(tidyverse) # 固定随机种子确保结果可复现 set.seed(123) # 构造示例数据:3个分组,每组3个条形 df <- tibble( # 每组内的3个条形类别 sub_category = rep(c("指标1", "指标2", "指标3"), 3), # 分组名称:对照组、处理组1、处理组2 group = rep(c("对照组", "处理组1", "处理组2"), each = 3), # 随机生成条形高度数值 value = sample(15:40, 9, replace = TRUE) ) %>% # 给每个条形分配连续的x轴位置,用于后续定位分组边界 mutate(x_pos = row_number())
步骤2:绘制图形
核心是用geom_col画条形,geom_segment绘制分组水平线,geom_text添加分组标签:
ggplot(df, aes(x = x_pos, y = value)) + # 绘制分组条形,按子类别区分填充色 geom_col(aes(fill = sub_category), width = 0.8) + # 添加分组水平线:计算每个分组的左右边界,y轴位置略高于所有条形的最大值 geom_segment( data = df %>% group_by(group) %>% summarise( x_start = min(x_pos) - 0.4, # 条形左边界外扩0.4,让线更贴合分组 x_end = max(x_pos) + 0.4, y_line = max(df$value) + 3 # 水平线高度比最大值高3,避免遮挡条形 ), aes(x = x_start, xend = x_end, y = y_line, yend = y_line), color = "#333333", linewidth = 0.8 ) + # 添加分组标签:位于水平线中间位置,高度比线略高 geom_text( data = df %>% group_by(group) %>% summarise( x_mid = mean(x_pos), y_label = max(df$value) + 4.5 ), aes(x = x_mid, y = y_label, label = group), size = 4.5, fontface = "bold", color = "#222222" ) + # 替换x轴刻度为子类别名称 scale_x_continuous(breaks = df$x_pos, labels = df$sub_category) + # 自定义主题与标签 theme_minimal() + theme( axis.title.x = element_text(size = 13, margin = margin(t = 10)), axis.title.y = element_text(size = 13, margin = margin(r = 10)), legend.title = element_text(size = 12), plot.margin = margin(20, 20, 20, 20, "pt") # 调整边距防止标签被截断 ) + labs( x = "子类别", y = "测量值", fill = "子类别" )
自定义调整说明
- 如果需要增加/减少分组数量:只需修改
rep(c("对照组", "处理组1", ...), each = 3)中的分组名称列表即可 - 调整水平线高度:修改
y_line = max(df$value) + 3中的数值 - 更改条形宽度:调整
geom_col中的width参数 - 替换颜色:修改
geom_segment的color、geom_text的color或geom_col的fill映射
内容的提问来源于stack exchange,提问作者n3lmnTrxx
相关产品推荐
相关产品推荐

