如何在水平条形图的轴标签与数据间添加颜色标注面板?
问题描述
我绘制了一幅水平条形图,希望在y轴刻度标签与刻度之间,或刻度与绘图区域之间添加和y轴分组对应的彩色标注框。此前尝试用geom_point在0值附近添加标注,但存在两个问题:
- 需要反复调整点的距离和大小
- 标注距离轴刻度过远,明显处于绘图区域内
我提供了模拟数据和初始绘图代码,同时自己找到了一种优化方法,但希望有更通用的实现方案。
模拟数据与初始绘图代码
# 创建模拟数据 data <- runif(5, 1,10) data <- cbind.data.frame(data, c("Group1", "Group2", "Group3", "Group4", "Group5")) colnames(data) <- c("number", "group") # 初始绘图 ggplot(data) + geom_col(aes(y = group, x = number)) + coord_cartesian(xlim = c(0, NA), expand = F)
已尝试的优化方法
通过创建两个向左延伸的条形图实现:长条形承载分组颜色,短条形设为白色来分隔标注与绘图区,代码如下(注:代码中tissue_abbrv对应示例中的group,tisscol为自定义颜色向量):
ggnewscale::new_scale_fill() + geom_col(aes(x = -0.25, y = tissue_abbrv, fill = tissue_abbrv)) + scale_fill_manual(values = tisscol) + guides(fill = "none") + coord_cartesian(xlim = c(-0.5, NA), expand = F) + geom_vline(aes(xintercept = 0)) + ggnewscale::new_scale_fill() + geom_col(aes(x = -0.05, y = tissue_abbrv), fill = "white", col = "white") + geom_vline(aes(xintercept = 0), color = "white")
更通用的实现方案
可以使用geom_rect直接在y轴旁绘制彩色矩形标注,无需依赖额外的条形图层,步骤如下:
- 先定义分组对应的颜色向量:
group_cols <- c("Group1" = "#E69F00", "Group2" = "#56B4E9", "Group3" = "#009E73", "Group4" = "#F0E442", "Group5" = "#0072B2")
- 利用离散y轴的坐标特性(每个分组对应整数位置)绘制矩形标注:
ggplot(data) + # 绘制彩色标注矩形:控制x范围实现标注位置,y范围贴合分组高度 geom_rect(aes(ymin = as.integer(group) - 0.4, ymax = as.integer(group) + 0.4, xmin = -0.3, xmax = 0, fill = group)) + # 绘制主水平条形图 geom_col(aes(y = group, x = number)) + # 绑定分组与颜色 scale_fill_manual(values = group_cols) + # 隐藏冗余图例 guides(fill = "none") + # 调整x轴范围以显示左侧标注区 coord_cartesian(xlim = c(-0.3, NA), expand = F) + # 可选:添加竖线分隔标注区与绘图区 geom_vline(xintercept = 0, color = "black", linewidth = 0.5)
方案优势
- 无需切换填充刻度或调整多层条形的顺序
- 可通过修改
xmin/xmax/ymin/ymax参数,灵活控制标注框的大小、位置 - 标注框完全贴合y轴分组,不会出现偏移问题
内容的提问来源于stack exchange,提问作者Pau Clavell-Revelles
相关产品推荐
相关产品推荐

