พล็อตเส้นแนวโน้มในระดับลอการิทึม

ฉันกำลังพยายามเพิ่มเส้นแนวโน้มให้กับพล็อต 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
ขอบคุณ EitanT ได้โปรดสิ่งที่ฉันต้องการบรรลุจริงๆ จะแสดงอยู่ในรูปภาพในลิงค์นี้ img708.imageshack.us/img708/7717/0056005c.jpg ฉันได้วางแผนไว้แล้ว ข้อมูลเดียวกันและต้องการให้เป็นเส้นตรงตามที่แสดงในโครงเรื่อง ผมขอขอบคุณความช่วยเหลือของคุณ. - person user1641478; 08.01.2013
comment
@ user1641478 อ่า เข้าใจแล้ว โปรดตรวจสอบคำตอบที่แก้ไขของฉันแล้ว - person Eitan T; 08.01.2013