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

RStudio中按年龄组绘制含数量与占比的分组柱状图问题

解决你的ggplot柱状图问题

直接可用的修改后代码

library(ggplot2)
library(scales) # 用于处理百分比格式

p1 <- ggplot(data = people, aes(x = AgeGroup, fill = sex)) +
  geom_bar(position = position_stack()) +
  # 处理文本:对应位置、匹配颜色、显示数量+占比
  geom_text(
    stat = "count",
    aes(
      label = paste0(after_stat(count), "\n(", percent(after_stat(count / sum(count))), ")"),
      color = sex
    ),
    position = position_stack(vjust = 0.5), # 文本放在柱子中间防重叠;要放上方改vjust=-0.1即可
    size = 3
  ) +
  # 让文本颜色和柱子填充色完全一致
  scale_color_manual(values = hue_pal()(2)) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 90, hjust = 1), # x轴文本右对齐更美观
    # 隐藏Y轴所有元素
    axis.text.y = element_blank(),
    axis.title.y = element_blank(),
    axis.ticks.y = element_blank(),
    legend.title = element_text(text = "性别") # 可选:修改图例标题为中文
  )

p1

核心调整说明

  • 解决文本重叠+颜色不匹配:

    • 给geom_text的aes参数加上color = sex,让文本颜色与对应性别柱子绑定,再用scale_color_manual复用柱子的调色板,保证颜色完全对应。
    • 设置position = position_stack()与geom_bar的堆叠方式一致,搭配vjust调整文本在柱子内的位置,彻底解决重叠问题。
  • 显示数量+占比:

    • 用paste0把计数(after_stat(count))和分组占比(count/sum(count))拼接在一起,sum(count)会自动按每个AgeGroup分组计算总人数,得到的就是该组内男女的占比。
    • 加入\n换行,让数量和占比分行显示,可读性更强。
  • 隐藏Y轴:

    • 通过theme将Y轴的文本、标题、刻度都设为element_blank(),直接实现Y轴为空的效果。

备选方案:提前预处理数据(更灵活高效)

如果数据量较大,提前汇总后再绘图效率更高,代码如下:

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

# 按年龄组+性别汇总人数,计算占比
people_summary <- people %>%
  group_by(AgeGroup, sex) %>%
  summarise(count = n(), .groups = "drop") %>%
  group_by(AgeGroup) %>%
  mutate(percent = percent(count / sum(count)))

# 用汇总后的数据绘图
p1 <- ggplot(people_summary, aes(x = AgeGroup, y = count, fill = sex)) +
  geom_col(position = position_stack()) +
  geom_text(
    aes(label = paste0(count, "\n(", percent, ")"), color = sex),
    position = position_stack(vjust = 0.5),
    size = 3
  ) +
  scale_color_manual(values = hue_pal()(2)) +
  theme_minimal() +
  theme(
    axis.text.x = element_text(angle = 90, hjust = 1),
    axis.text.y = element_blank(),
    axis.title.y = element_blank(),
    axis.ticks.y = element_blank()
  )

p1

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 13:41:01