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

如何在ggplot的Y轴分类标签下方显示计数、总计数及百分比

问题描述

如何在ggplot生成的图表中,在Y轴的分类标签下方以括号形式显示观测计数、总计数以及百分比?变量sex_vic为分类变量,期望效果是Y轴标签类似Female (145/355, 40.8%)这样的形式。

现有代码:

sur %>%
ggplot(aes(y = sex_vic)) +
geom_bar() +
labs(x = "sex", y = "No of people") +
ggtitle("Sex of victims") 

使用的数据结构:

structure(list(sex_vic = structure(c(1L, 2L, 2L, 1L, 2L, 2L, 
2L, 2L, 2L, 1L, 2L, 2L, 1L, 2L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 2L, 
2L, 2L, 2L, 2L, 1L, 1L, 2L, 2L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 1L, 2L, 2L, 2L, 2L, 1L, 2L, 1L, 2L, 2L, 1L, 1L, 2L, 1L, 
2L, 2L, 2L, 1L, 1L, 2L, 2L, 2L, 1L, 2L, 2L, 1L, 1L, 2L, 2L, 1L, 
2L, 2L, 2L, 2L, 2L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 
2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 2L, 1L, 1L, 1L, 2L, 2L, 
1L, 2L, 1L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 2L, 1L, 1L, 
1L, 2L, 2L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 2L, 2L, 1L, 
2L, 1L, 2L, 1L, 1L, 1L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 1L, 2L, 1L, 1L, 1L, 2L, 1L, 1L, 2L, 2L, 2L, 1L, 2L, 2L, 
2L, 2L, 2L, 1L, 1L, 1L, 2L, 2L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 2L, 2L, 1L, 2L, 2L, 2L, 1L, 2L, 2L, 1L, 1L, 2L, 2L, 2L, 1L, 
1L, 2L, 2L, 1L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 1L, 1L, 
2L, 1L, 2L, 2L, 1L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 
1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 1L, 1L, 2L, 1L, 1L, 1L, 
2L, 2L, 2L, 2L, 1L, 1L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 1L, 2L, 2L, 
1L, 2L, 1L, 2L, 2L, 2L, 1L, 1L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 2L, 
1L, 2L, 2L, 2L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 1L, 1L, 1L, 
2L, 2L, 2L, 2L, 1L, 1L, 2L, 2L, 2L, 1L, 2L, 1L, 1L, 2L, 2L, 1L, 
1L, 2L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 2L, 1L, 2L, 2L, 1L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 1L, 
2L, 1L, 1L, 2L, 2L, 1L, 1L, 2L, 1L, 1L, 2L, 1L, 2L), levels = c("Female", 
"Male"), class = "factor")), row.names = c(NA, -355L), class = "data.frame")
解决方案

要实现这个效果,需先计算每个分类的统计量,再替换Y轴标签,具体步骤如下:

  1. 计算分类统计量
    先汇总数据,得到每个分类的观测数、总观测数和百分比,再生成新的标签文本:
library(dplyr)

# 计算各分类计数、总数、百分比
counts <- sur %>%
  count(sex_vic) %>%
  mutate(total = sum(n),
         pct = paste0(round(n/total*100, 1), "%"))

# 生成带统计信息的标签,与原分类对应
new_labels <- paste0(counts$sex_vic, " (", counts$n, "/", counts$total, ", ", counts$pct, ")")
names(new_labels) <- counts$sex_vic
  1. 修改ggplot代码替换标签
    在原绘图代码中加入scale_y_discrete(),用新标签替换默认Y轴分类:
library(ggplot2)

sur %>%
  ggplot(aes(y = sex_vic)) +
  geom_bar() +
  scale_y_discrete(labels = new_labels) +  # 替换Y轴标签
  labs(x = "人数", y = "受害者性别") +
  ggtitle("受害者性别分布")
  1. 整合式写法
    也可以将统计计算与绘图用管道流整合:
sur %>%
  count(sex_vic) %>%
  mutate(total = sum(n),
         pct = paste0(round(n/total*100, 1), "%"),
         label = paste0(sex_vic, " (", n, "/", total, ", ", pct, ")")) %>%
  right_join(sur, by = "sex_vic") %>%
  ggplot(aes(y = sex_vic)) +
  geom_bar() +
  scale_y_discrete(labels = unique(.$label)) +
  labs(x = "人数", y = "受害者性别") +
  ggtitle("受害者性别分布")

生成的图表Y轴标签会同时显示分类名称、观测计数/总计数、百分比,满足需求。

内容的提问来源于Stack Exchange,提问作者Rakesh Chand

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 12:56:58