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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 17:12:28