ggplot中geom_function报错:无法匹配x与y长度,求解决方法
问题:ggplot复现base plot生长模型时出现维度不匹配错误
我之前用base plot()成功绘制了生长模型,现在尝试用ggplot()复现,但运行代码时出现两次相同错误:
Caused by error in
data_frame():
! Can't recyclex(size 101) to matchy(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
相关产品推荐
相关产品推荐

