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

如何让ggplot2条形图上方的百分比标签保持统一间距?

问题:统一条形图百分比标签与条形顶部的间距

示例数据:

library(dplyr)
library(tidyr)

# example data frame
df <- data.frame(
  col1 = c("A;B;C", "A;B", "B;C", "A;C", "B", "A;B;C;D"),
  col2 = c("X;Y;Z", "X;Y", "Y;Z", "X;Z", "Z", "W;X;Y;Z"),
  col3 = c("1;2", "1", "2;3", "3", "4;5;6", "7"),
  col4 = c(1, 2, 3, 4, 5, 6),
  col5 = c(TRUE, FALSE, TRUE, FALSE, TRUE, FALSE)
)

# select columns to separate
selected_cols <- c("col1", "col2", "col3", "col4", "col5")

当前使用的绘图代码:

library(tidyr)
library(ggplot2)

lapply(c("col1", "col2"), function(col) {
  separate_rows(df, all_of(col), sep = ";") |>
    ggplot(aes(.data[[col]])) +
    geom_bar(aes(y = after_stat(count / sum(count)), fill = .data[[col]])) +
    geom_text(aes(label = scales::percent(after_stat(count/sum(count))), y = after_stat(count/sum(count))), 
          stat = "count", position = position_stack(vjust = 1.1)) +
    scale_y_continuous(labels = scales::percent)
})
#> [[1]]

遇到的问题:条形图上方的百分比标签与条形顶部的间距随百分比数值变化,无法保持统一。


解决方案

问题根源在于标签的y坐标直接绑定了条形的百分比高度,再通过position_stack(vjust = 1.1)调整位置,导致标签相对位置随条形高度波动。要实现统一间距,只需给标签的y坐标加上固定偏移量,让标签始终位于条形顶部上方的固定位置。

修改后的代码如下:

library(tidyr)
library(ggplot2)

lapply(c("col1", "col2"), function(col) {
  separate_rows(df, all_of(col), sep = ";") |>
    ggplot(aes(.data[[col]])) +
    geom_bar(aes(y = after_stat(count / sum(count)), fill = .data[[col]])) +
    # 给y坐标添加固定偏移量(0.02为参考值,可按需调整)
    geom_text(aes(label = scales::percent(after_stat(count/sum(count))), 
                  y = after_stat(count/sum(count)) + 0.02), 
              stat = "count", 
              # 让标签在条形上方居中对齐
              position = position_stack(vjust = 0.5)) +
    scale_y_continuous(labels = scales::percent, 
                       # 扩大y轴范围,避免标签超出图表边界
                       limits = c(0, 1.1))
})

关键修改说明:

  • 给geom_text的y参数增加固定偏移量:after_stat(count/sum(count)) + 0.02,数值越大,标签与条形的间距越宽。
  • 调整position_stack(vjust = 0.5)确保标签在条形上方居中。
  • 通过scale_y_continuous(limits = c(0, 1.1))扩展y轴范围,防止标签超出图表显示区域。

修改后,所有标签与对应条形顶部的间距会保持统一,不再随百分比数值变化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 23:12:09