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

ggplot直方图优化:添加柱子顶部百分比及格式调整问题

解决你的ggplot直方图/条形图调整问题

我来帮你一次性搞定这三个问题!咱们先理清楚思路:因为你的group是离散型分组,用**条形图(geom_bar)**会比直方图更顺手,这样x轴标签、百分比计算都会更直观。下面是完整的解决方案:

步骤1:预处理数据(统计百分比)

首先我们用dplyr先统计每个分组、性别组合的百分比,同时给group设置自定义标签:

library(ggplot2)
library(dplyr)
library(scales)

# 生成示例数据(设置种子保证结果可复现)
set.seed(123)
sex <- sample(0:1, 100, replace=TRUE)
group <- sample(2:5, 100, replace=TRUE)
data <- data.frame(sex, group)

# 预处理数据:转因子、统计百分比
data_summary <- data %>%
  # 把group转成因子,自定义x轴显示标签
  mutate(group = factor(group, 
                        levels = c(2,3,4,5), 
                        labels = c("分组2", "分组3", "分组4", "分组5"))) %>%
  # 统计每个group+sex的样本数量
  count(group, sex) %>%
  # 按group分组计算占比(转成百分比)
  group_by(group) %>%
  mutate(percent = n / sum(n) * 100) %>%
  ungroup() %>%
  # 给sex设置图例显示标签(可根据需求修改)
  mutate(sex = factor(sex, levels = c(0,1), labels = c("男性", "女性")))

步骤2:绘制带自定义设置的条形图

接下来用处理好的数据画图,同时解决你的三个核心需求:

ggplot(data_summary, aes(x = group, y = percent, fill = sex)) +
  # 绘制分组条形图,position_dodge保证柱子互不重叠
  geom_bar(stat = "identity", position = position_dodge(width = 0.9), width = 0.8) +
  # 添加顶部百分比标签,和柱子对齐,取整后显示百分号
  geom_text(aes(label = paste0(round(percent), "%")),
            position = position_dodge(width = 0.9),
            vjust = -0.5, # 调整标签与柱子顶部的距离
            size = 3.5) +
  # 隐藏x/y轴标题
  theme(axis.title.x = element_blank(),
        axis.title.y = element_blank()) +
  # 设置图例标题
  guides(fill = guide_legend(title = "性别")) +
  # y轴显示整数格式的百分比
  scale_y_continuous(labels = percent_format(accuracy = 1)) +
  # 应用你指定的HEX填充颜色
  scale_fill_manual(values = c("#b6181f", "#f6b8bb")) +
  # 可选:给y轴顶部留一点空间,避免标签超出图表范围
  expand_limits(y = max(data_summary$percent) + 5)

关键调整说明

  • 替换x轴因子标签:通过mutate(group = factor(...))指定levels(原始分组值)和labels(自定义显示文本),x轴会自动替换成你想要的标签。
  • 百分比取整:在percent_format()里添加accuracy = 1,让y轴百分比显示为整数;标签里用round(percent)把计算出的百分比取整后再显示。
  • 柱子顶部添加百分比:先预处理数据统计好准确的百分比,再用geom_text结合position_dodge让标签和对应的柱子精确对齐,vjust参数可以灵活调整标签在柱子上方的位置。

如果你的原始数据中group本来就是因子类型,只需要调整labels部分即可;如果一定要用直方图(比如group是连续型变量),也可以套用类似的统计逻辑,不过离散分组用条形图会更符合可视化逻辑哦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:19:40