如何在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轴标签,具体步骤如下:
- 计算分类统计量
先汇总数据,得到每个分类的观测数、总观测数和百分比,再生成新的标签文本:
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
- 修改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("受害者性别分布")
- 整合式写法
也可以将统计计算与绘图用管道流整合:
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
相关产品推荐
相关产品推荐

