Построение линии тренда в логарифмическом масштабе

Я пытаюсь добавить линию тренда к графику 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');

Как сделать так, чтобы линия тренда отображалась в виде линии?


person user1641478    schedule 06.01.2013    source источник


Ответы (1)


К polyfit тут претензий быть не должно, работает.

Это ваш сюжет:

введите здесь описание изображения

Все имеет смысл. Причина, по которой ваша линия искажается, заключается в том, что ваша ось x имеет логарифмическую шкалу (если вы строите линию ax+b в логарифмической шкале x, вы увидите ее как кривую alogx+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));

И это должно дать вам следующий сюжет:

введите здесь описание изображения

Опять же, имейте в виду, что это логарифмическая шкала!

Надеюсь это поможет :)

person Eitan T    schedule 06.01.2013
comment
Спасибо за ответ. Чего я хочу добиться, так это использовать polyfit для получения прямой линии в пределах y (17:20), чтобы я мог вычислить наклон и пересечение прямой в этой области исходной кривой данных. - person user1641478; 06.01.2013
comment
@ user1641478 Какой у (17:20)? Последние точки в вашем векторе данных y или последние точки на самом графике? Как я объяснил в своем ответе, это разные точки, потому что ваш вектор данных y не отсортирован в порядке возрастания. - person Eitan T; 06.01.2013
comment
Спасибо ЭйтанТ. Пожалуйста, чего я действительно хочу достичь, показано на изображении по этой ссылке. img708.imageshack.us/img708/7717/0056005c.jpg Я начертил те же данные и хотите иметь прямую линию, как показано на графике. Я действительно ценю твою помощь. - person user1641478; 08.01.2013
comment
@user1641478 user1641478 А, теперь понятно. Тогда просмотрите мой исправленный ответ. - person Eitan T; 08.01.2013