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

使用R中approxfun()拟合密度函数时的绘图范围问题

问题分析与解决方案

你遇到的问题其实不是approxfun()没完整捕捉密度分布,而是plot()函数在绘制由approxfun()生成的函数时,默认的x轴范围是[0,1],这才导致绘图只显示到x=1的部分。咱们一步步拆解解决:

问题根源

当你调用plot(estim)时,R的plot.function()方法默认会生成一个从0到1的序列(默认101个点)来绘制函数,完全忽略了estim实际的有效定义域——也就是原始密度曲线的x范围。而plot(dens)是专门针对density类对象的绘图方法,它会自动使用dens$x的范围,所以能显示完整曲线。

修复方法

方法1:绘图时指定x轴范围

直接用原始密度曲线的x范围来约束绘图的坐标轴,就能完整显示拟合的函数:

Example = seq(0.5, 1.5, 0.005)
dens = density(Example)
estim = approxfun(dens)
# 用dens$x的范围来生成完整绘图
plot(estim, xlim = range(dens$x), main = "完整显示的拟合密度函数")
# 可以叠加原始密度曲线做对比
lines(dens, col = "red", lty = 2)

方法2:明确给approxfun()传入x和y参数(更清晰)

虽然approxfun()可以直接接受density对象(因为它是包含x、y的列表),但明确指定参数会让代码更易读,也避免潜在歧义:

estim = approxfun(x = dens$x, y = dens$y)
# 同样指定xlim来绘图
plot(estim, xlim = range(dens$x), col = "blue")
lines(dens, col = "red", lty = 2)

方法3:直接用dens$x作为绘图的x值

如果你想完全复刻plot(dens)的x轴精度,可以直接用dens$x来计算estim的取值,然后绘图:

plot(dens$x, estim(dens$x), type = "l", main = "和原始密度曲线完全对齐的拟合")
lines(dens, col = "red", lty = 2)

验证小技巧

你可以检查estim的有效定义域,确认它本身是覆盖完整范围的:

range(dens$x)
# 输出会是类似0.3到1.7左右的区间(具体取决于density的带宽参数)

这说明estim本身能处理这个范围内的所有x值,只是默认的plot()没用到这些范围而已。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:13:09