R语言ggplot绘制箱线图时在绘图边界外标注各组样本量N
ggplot2 箱线图外侧标注分组样本量实现方案
可以通过关闭绘图裁剪、预留边距加文本标注的方式实现,不会挤占绘图内部空间,具体步骤如下:
- 先按照绘图时的x轴排序规则,提前计算每个物种对应的样本量,避免标注错位
- 调整绘图右侧边距,为样本量列预留足够显示空间
- 关闭绘图区域裁剪限制,在预留的外侧位置添加"N"表头和各组样本量数值
修改后的可运行代码如下:
library(ggplot2) library(dplyr) # 原数据构造逻辑保持不变 df <- data.frame(year = rep(c(2019, 2020), each = 10), month = rep(c("March", "October"), each = 1), site = rep(c("1", "2", "3", "4", "5"), each = 2), type = rep(c("baitfish", "shark"), each = 1), salinity = sample(x = 20:35, size = 20, replace = TRUE), num = sample(x = 0:10, size = 20, replace = TRUE)) count_by_row <- data.frame(df[rep(row.names(df), df$num), 1:5]) plot_df <- subset(count_by_row, !is.na(salinity)) # 按绘图x轴的排序规则(按salinity中位数降序)计算各组样本量 n_count <- plot_df %>% group_by(type) %>% summarise(N = n()) %>% arrange(desc(tapply(plot_df$salinity, plot_df$type, median)[type])) ggplot(plot_df, aes(x = reorder(type, -salinity, FUN = median), y = salinity)) + geom_boxplot(outlier.shape = 1, outlier.size = 2) + # 关闭裁剪,允许绘图区域外显示标注内容 coord_flip(clip = "off") + # 调整边距:上、右、下、左四个方向,右侧预留3个行宽放样本量列 theme(plot.margin = unit(c(1,3,1,1), "lines")) + # 添加N表头,位置在图最上方、y轴最大值外侧 annotate("text", x = 0.5, y = max(plot_df$salinity) + 2, label = "N", fontface = "bold") + # 匹配每个箱线位置添加对应样本量 annotate("text", x = 1:nrow(n_count), y = max(plot_df$salinity) + 2, label = n_count$N) + xlab("") + ylab("salinity (PSU)")
关键参数说明:
clip = "off"必须加在coord_flip()里,否则超出绘图区的内容会被自动裁剪无法显示- 标注对应的y轴位置可以根据实际数据范围调整,只要比y轴最大值大1-3个单位,就会落在你标记的右侧红色区域位置
- 代码里的样本量计算逻辑和绘图时x轴的排序规则完全绑定,后续调整分组顺序时样本量标注会自动匹配位置,不会错位
内容的提问来源于stack exchange,提问作者Nate
相关产品推荐
相关产品推荐

