1

我正在尝试将趋势线添加到semilogx绘图中,但无法成功。我想要 和 之间的趋势线y(17)y(20)但它没有绘制为直线。

这是我的代码:

%// Define equation.
x = [90868 68151 45434 34076 27261 13631 6816 3408 2273 1948 1705 1137 853 683 569 455 342 274 228 190]; 
y = [3680 3723 3800 3866 3920 4103 4250 4320 4340 4344 4350 4364 4373 4379 4384 4393 4398 4402 4405 4407];

%// Plot it
semilogx(x,y, 'bo-', 'LineWidth', 3); 
grid on; 

%// Enlarge figure to full screen.
set(gcf, 'units','normalized','outerposition',[0 0 1 1]);

%// Give a name to the title bar. 
set(gcf,'name','Demo by ImageAnalyst','numbertitle','off')

%// Fit the y data range with a line (limitedRange).
limitedRange = 17:20;
coeffs = polyfit(x(limitedRange), y(limitedRange), 1);
xFitting = linspace(200, 90000, 50);
yFitted = polyval(coeffs, xFitting);

%// Plot the fitted line over the specified range.
hold on;
plot(xFitting, yFitted, 'ro-', 'LineWidth', 2);
legend('Original Data', 'Line Fit');

如何使趋势线显示为一条线?

4

1 回答 1

3

这里不应该有任何抱怨polyfit,它有效。

这是你的情节:

在此处输入图像描述

一切都说得通。你的线扭曲的原因是你的 x 轴有一个对数刻度(如果你在对数 x 刻度上绘制一条线,你会看到它是一条曲线)。ax+balogx+b

要将其视为对数 x 轴上的一条线,您需要引入适当的“反向”失真。在您的情况下,趋势线应该像这样计算:

limitedRange = 17:20;
coeffs = polyfit(log10(x(limitedRange)), y(limitedRange), 1); %// Note the log10
xFitting = linspace(200, 90000, 50);
yFitted = polyval(coeffs, log10(xFitting));                   %// Note the log10

这还不是全部。在对数刻度中,低 x 坐标的间距往往更大,趋势线圆圈在 x 轴的较高值处会更密集。为了否定这一点,您需要xFitting在线性刻度上以指数间隔排列点,以便它们在对数刻度上呈线性间隔,例如:

xFitting = 10 .^ (1:.1:5);

或使用内置logspace函数:

xFitting = logspace(1, 5, 50);

计算趋势线的最终代码应该是:

limitedRange = 17:20;
coeffs = polyfit(log10(x(limitedRange)), y(limitedRange), 1);
xFitting = logspace(1, 5, 50);
yFitted = polyval(coeffs, log10(xFitting));

这应该给你以下情节:

在此处输入图像描述

同样,请记住,这是一个对数刻度!

希望这可以帮助 :)

于 2013-01-06T11:40:03.257 回答