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 に答える