如何在带分面的有序ggplot小提琴图右侧标注每组观测数?
解决方案
要在每个分面右侧边框内侧标注小提琴对应的观测数量,可按以下步骤修改代码:
- 计算观测数:基于处理后的数据集,统计每个
plot_fct(物种与测量指标的组合)的观测数量,并生成标注文本。 - 添加标注层:在ggplot中使用
geom_text,将标注定位到每个分面的右侧边界内侧。
完整代码如下:
require(tidyverse) require(purrr) require(forcats) # 处理数据并创建有序因子 tbl <- iris %>% pivot_longer(cols = 1:4, names_to = "Msr", values_to = "Vls") %>% mutate(Msr = factor(Msr)) %>% mutate(plot_fct = fct_cross(Species, Msr)) %>% mutate(plot_fct = fct_reorder(plot_fct, Vls)) # 计算每个分组的观测数,生成标注文本 tbl_counts <- tbl %>% count(plot_fct, Species) %>% mutate(label = paste0("n=", n)) # 自定义对数刻度次要断点函数 minor_breaks_log <- function(base) { force(base) function(limits) { ggplot2:::calc_logticks( base = base, minpow = floor(log(limits[1], base = base)), maxpow = ceiling(log(limits[2], base = base)) )$value } } # 绘制带观测数标注的小提琴图 ggplot(data = tbl, aes(x = plot_fct, y = Vls, fill = Species)) + geom_violin() + coord_flip() + scale_y_log10(labels = function(x) sprintf("%g", x), minor_breaks = minor_breaks_log(10)) + theme_bw(base_size = 12) + annotation_logticks(base = 10, sides = "b") + facet_wrap(~Species, nrow = 1, scales = "free") + # 添加观测数标注:x=Inf定位到分面右边界,hjust=1.05微调确保在边框内侧 geom_text( data = tbl_counts, aes(y = plot_fct, x = Inf, label = label, fill = NULL), hjust = 1.05, size = 3.5 )
关键说明:
tbl_counts通过count()统计每个分组的观测数,生成"n=XX"格式的标注文本,适配任意数据集的通用场景。x=Inf将标注定位到当前分面翻转后的x轴(原y轴)最大值边界,hjust=1.05微调文本位置,确保完全在边框内侧。fill=NULL取消继承主图层的颜色映射,避免标注出现不必要的颜色干扰。
内容的提问来源于stack exchange,提问作者Markm0705
相关产品推荐
相关产品推荐

