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

在ggplot2中按分组元素数量选择geom_smooth的不同公式

解决ggplot2中按分组样本量选择不同拟合公式的问题

问题描述

需要为图表中每个分组添加geom_smooth拟合线,规则为:

  • 分组元素数少于4时,使用线性公式y~x
  • 分组元素数4个及以上时,使用对数公式y~log(x,2)

原始代码尝试用n()判断分组行数,但报错:

Error in n():
! Must only be used inside data-masking verbs like mutate(), filter(), and group_by()

解决方案

步骤1:预处理数据,添加分组样本量

先给数据集新增一列,记录每个分组的观测数量,后续用于筛选数据:

library(tidyverse)
library(ggplot2)

# 给数据添加分组大小列
df <- df %>%
  group_by(group) %>%
  mutate(group_size = n()) %>%
  ungroup()

步骤2:分图层应用不同拟合公式

通过两个geom_smooth图层,分别对不同样本量的分组应用对应公式:

df %>%
  ggplot(aes(x = mduration, y = yield, color = group, group = group, label = ticker)) +
  geom_point() +
  # 对样本量<4的分组用线性拟合
  geom_smooth(
    data = . %>% filter(group_size < 4),
    method = "lm",
    formula = y ~ x,
    se = FALSE
  ) +
  # 对样本量>=4的分组用对数拟合
  geom_smooth(
    data = . %>% filter(group_size >= 4),
    method = "lm",
    formula = y ~ log(x, 2),
    se = FALSE
  )

原理说明

  • 原始代码报错是因为n()只能在数据掩码类函数(如mutate()、filter())中使用,geom_smooth的formula参数不支持直接调用n()获取分组样本量。
  • 通过预先计算每个分组的样本量,再用filter()筛选数据分别拟合,就能实现按分组大小选择公式的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 11:02:41