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

如何在ggplot散点图中自动标注正负分数的观测数(支持分面)

解决方案

核心思路

利用ggplot2的stat_summary()结合自定义统计函数,让ggplot自动在每个分面(或全局)的子数据中计算scores>0和scores<0的观测数,并返回标注的位置与文本内容,无需提前全局计算。

步骤1:自定义统计函数

这个函数会接收每个绘图面板的子数据集,计算正负值计数,并返回包含标注坐标和文本的数据框:

label_counts <- function(data) {
  # 计算正负scores的数量(忽略NA)
  n_pos <- sum(data$scores > 0, na.rm = TRUE)
  n_neg <- sum(data$scores < 0, na.rm = TRUE)
  
  # 返回标注的位置与文本:这里把标注放在面板的右上角和右下角
  data.frame(
    x = Inf,          # 固定在x轴最右侧
    y = c(Inf, -Inf), # 分别放在y轴顶部和底部
    label = c(paste("Scores > 0:", n_pos), paste("Scores < 0:", n_neg)),
    stringsAsFactors = FALSE
  )
}

步骤2:整合到ggplot代码中

将自定义函数传入stat_summary(),配合geom_text()渲染标注,同时支持facet_wrap自动适配每个分面:

library(ggplot2)

# 示例数据(可替换为你的mydata)
set.seed(123)
mydata <- data.frame(
  rank = 1:100,
  scores = rnorm(100),
  group = rep(c("Group A", "Group B"), each = 50) # 用于测试分面
)

# 绘图代码
ggplot(mydata, aes(x = rank, y = scores)) +
  geom_point() +
  # 添加自动计算的计数标注
  stat_summary(
    fun.data = label_counts,
    geom = "text",
    hjust = 1.1,        # 文本右对齐,避免被图框截断
    vjust = c(1.1, -0.1),# 顶部标注上移,底部标注下移
    size = 3.5,
    color = "darkred"
  ) +
  # 分面设置(按需添加)
  facet_wrap(~group)

关键说明

  • 自定义函数必须返回包含x、y(坐标)和label(标注文本)的数据框,这是stat_summary()要求的格式。
  • 使用Inf/-Inf作为坐标可以让标注固定在面板边缘,不受数据范围影响。
  • 开启facet_wrap后,每个分面会自动调用label_counts计算当前面板的正负值数量,完全适配分面场景。

内容的提问来源于stack exchange,提问作者ricardo3889

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 16:05:26