在cfit图中更改XLim

时间:2014-08-28 12:41:32

标签: matlab plot

我无法在曲线拟合对象的图中更改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命令。

2 个答案:

答案 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他们实际上声明它应该有效。这可能是一个应该报告的错误。