在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 likemutate(),filter(), andgroup_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
相关产品推荐
相关产品推荐

