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

ggplot中geom_function报错:无法匹配x与y长度,求解决方法

问题:ggplot复现base plot生长模型时出现维度不匹配错误

我之前用base plot()成功绘制了生长模型,现在尝试用ggplot()复现,但运行代码时出现两次相同错误:

Caused by error in data_frame():
! Can't recycle x (size 101) to match y (size 71).

推测是两个geom_function()导致的,想明确错误含义及修复方法。


错误含义

这个错误的核心是数据维度不匹配:

  • geom_function()默认会在你设置的xlim(0,75)范围内生成101个均匀分布的x值,用于绘制曲线
  • 但你定义的vbf.func.fem和vbf.func.male函数里,硬编码使用了全局变量age_vec(长度71,是seq(0,70)生成的序列),导致函数返回的y值长度固定为71
  • ggplot需要将x和y配对成数据框,但101个x无法和71个y匹配,因此触发"无法回收"的报错

修复方法

修复的关键是让自定义函数使用geom_function()传入的age参数(即ggplot自动生成的x值),而非硬编码全局的age_vec。修改后的完整代码如下:

# 修改后的自定义函数:用参数age替代全局变量age_vec
vbf.func.fem <-function(age, A, Ti, k) {
  A * (1 - ((1 / 3) * exp(-(9 / 4) * k * (age - Ti))))^3
}


vbf.func.male <-function(age, A, Ti, k, Adiff, Tidiff, kdiff) {
  (A + Adiff) * (1 - ((1 / 3) * exp(-(9 / 4) * (k + kdiff) * (age - (Ti + Tidiff)))))^3
}

# 参数估计值(保留原定义)
A.est <- 18.814742
Ti.est <- 7.259709
k.est <- 0.031346 
age_vec <- seq(0, 70)
a.est.diff <- -0.920932
ti.est.diff <- 0.230792 
k.est.diff <- 0.002064

# 修复后的ggplot绘图代码
ggplot() +
  xlim(0,75) +
  ylim(0, 25) +
  geom_function(fun = vbf.func.fem, args = list(A = A.est, Ti = Ti.est, k = k.est), color = 'blue') +
  geom_function(fun = vbf.func.male, args = list(A = A.est, Ti = Ti.est, k = k.est, Adiff = a.est.diff, Tidiff = ti.est.diff, kdiff = k.est.diff), color = 'red')

# 原base plot代码(保留不变)
hallux_fem = A.est * (1 - ((1 / 3) * exp(-(9 / 4) * k.est * (age_vec - Ti.est))))^3
hallux_male = (A.est + a.est.diff) * (1 - ((1 / 3) * exp(-(9 / 4) * (k.est + k.est.diff) * (age_vec - (Ti.est + ti.est.diff) ))))^3 

graphics.off()
plot(age_vec, hallux_fem, type = "n", cex.lab=0.6, cex.axis=0.75, xlab = "Age (days)", tck=0.01, font.lab=2, ylab = 'Hallux (mm)', las = 1, ylim = c(0,22), xlim = c(0,70), xaxs = "i", yaxs = "i", bty = "l", cex.lab = 1,axes=T)
lines(age_vec, hallux_fem, lty = 1, lwd = 1, col = rgb(0.1,0.1,0.8,1))
lines(age_vec, hallux_male, lty = 1, lwd = 1, col = rgb(0,0,0,1))

修改后,geom_function()会为xlim(0,75)范围内的每个x值调用函数,生成对应长度的y值,x和y维度完全匹配,即可正常绘制曲线。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 08:47:09