我无法在曲线拟合对象的图中更改x范围(XLim)。
准备最小示例
让我们使用曲线拟合工具箱中的fit
来定义噪声数据并使函数适合它。
xdata = (0:0.1:1)';
noise = 0.1*randn(size(xdata));
ydata = xdata.^2 + noise;
f = fittype('a*x.^2 + b');
fit1 = fit(xdata, ydata, f, 'StartPoint', [1,1]);
fit1
现在是一个cfit对象,我们可以使用它的(重载)plot
方法绘制它:
plot(fit1, xdata, ydata)
问题
当我们现在使用set(gca, 'XLim', [0,2])
更改绘图的XLim时,绘图会更新,但拟合曲线不会延长。您可以在plot
命令中自动执行的文档suggests,但对于我来说不适用:
plot(fit1, xdata, ydata, 'XLim', [0, 1])
-> Subscript indices must either be real positive integers or logicals.
-> Error in cfit/plot (line 228)
-> handles = plot(xpoints(~outliers),ypoints(~outliers),S2,...
如果我使用cftool
进行拟合(fit
的GUI包装器),我可以在Tools->Axes Limits
下输入XLim。然后显示整个范围的拟合函数。我该如何以编程方式执行此操作?
我知道您可以评估给定范围的拟合函数,但是当您必须为置信区间和几个拟合时,这变得乏味。我正在寻找一种更简单的方法,我认为我只是错误地使用plot
命令。
答案 0 :(得分:1)
文档说明当您绘制拟合对象时,它将外推到当前轴限制。更改绘图限制后,它不会重新绘制线条。此外,当您重载 plot 时,它会将fitdata绘制为与xdata / ydata相同的长度。为了实现目标,你可以做到
figure; hold on
plot(xdata,ydata,'.')
ext_xdata = 0:0.1:2;
plot(ext_xdata,fit1.a*ext_xdata.^2 + fit1.b,'r')
但是您提到上述解决方案对您来说是不合适的,因为您的应用程序很复杂。另一种方法是
figure; hold on
plot(xdata,ydata,'.')
set(gca,'xlim',[0, 2]);
plot(fit1)
这不是一个像你似乎要寻找的单行解决方案,但它不需要指定一个新的xrange。
答案 1 :(得分:0)
用于绘制plot
对象的函数fit
实际上会重载标准plot
函数。如果您尝试设置断点(如果出现错误(dbstop error
),您会看到在绘制拟合对象的函数内部调用实际的matlab plot
函数。语法不完全相同,这意味着在绘制函数后需要调用xlim([minLim,maxLim]);
plot(fit1,xdata, ydata);
xlim([minLim,maxLim]);
我不确定为什么会发生这种情况,因为matlabs documentation他们实际上声明它应该有效。这可能是一个应该报告的错误。