如何在ggplot2的geom_count图中自动添加各类观测的百分比标注
给geom_count点图批量添加百分比标注的简便方法
问题场景
你用下面的代码创建了数据集,并用geom_count画出了以点大小展示观测频率的图表,但现在想给每个点旁边加上对应的百分比数值,手动逐个加注释太繁琐,想找高效的实现方式:
# 注意:原代码里Var1、Var2的A/B/C要加引号,不然会报错 df <- tibble(ID = c(1:12), Var1 = c("A", "B", "C", "C", "C", "A", "B", "B", "C", "A", "B", "C"), Var2 = c("B", "B", "A", "A", "C", "C", "A", "A", "B", "C", "A", "C") ) # 绘制点大小表示频率的图表 ggplot(df, aes(x = factor(Var1, level=c('A', 'B', 'C')), y = factor(Var2, level=c('A', 'B', 'C')) )) + geom_count(show.legend = FALSE) + labs(x = "Var1", y = "Var2") + theme_bw()
生成的图表效果:
省心的解决方案
不用手动一个个加注释,我们可以先提前统计每个(Var1, Var2)组合的频率和百分比,再用geom_text批量把标注加上:
1. 先统计频率和百分比
用dplyr分组统计,生成带百分比的汇总表:
library(dplyr) # 统计每个组合的频数,再计算百分比 df_summary <- df %>% count(Var1, Var2, name = "freq") %>% mutate(pct = paste0(round(freq / sum(freq) * 100, 1), "%")) %>% # 保持变量层级和绘图时一致,避免位置错位 mutate(Var1 = factor(Var1, level = c("A", "B", "C")), Var2 = factor(Var2, level = c("A", "B", "C")))
2. 绘图并添加百分比标注
在原ggplot代码里加入geom_text,用汇总好的数据映射标签,还可以调整标签位置避免遮挡点:
ggplot(df, aes(x = factor(Var1, level=c('A', 'B', 'C')), y = factor(Var2, level=c('A', 'B', 'C')) )) + geom_count(show.legend = FALSE) + # 添加百分比标注,nudge_y控制标签向上偏移一点 geom_text(data = df_summary, aes(label = pct), nudge_y = 0.15) + labs(x = "Var1", y = "Var2") + theme_bw()
这样不管你有多少组处理,都能自动批量生成所有点的百分比标注,不用手动重复操作。
内容的提问来源于stack exchange,提问作者Lin Jing
相关产品推荐
相关产品推荐

