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

如何在带分面的有序ggplot小提琴图右侧标注每组观测数?

解决方案

要在每个分面右侧边框内侧标注小提琴对应的观测数量,可按以下步骤修改代码:

  1. 计算观测数:基于处理后的数据集,统计每个plot_fct(物种与测量指标的组合)的观测数量,并生成标注文本。
  2. 添加标注层:在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 23:50:33