φυβλαςのβλογ
บล็อกของ phyblas



numpy & matplotlib เบื้องต้น บทที่ ๑๘: แถบความคลาดเคลื่อน
เขียนเมื่อ 2016/06/11 23:27
แก้ไขล่าสุด 2021/09/28 16:42
ในการวิเคราะห์ข้อมูล บางครั้งก็ไม่ได้มีแต่ข้อมูลที่มีความแม่นยำเสมอไป ย่อมมีความคลาดเคลื่อนอยู่เสมอ การจะแสดงความคลาดเคลื่อนที่มีลงในกราฟโดยทั่วไปจะใช้แถบความคลาดเคลื่อน



การวาดกราฟเส้นที่มีความคลาดเคลื่อน
กราฟที่มีแถบความคลาดเคลื่อนสามารถวาดได้โดยใช้ฟังก์ชัน errorbar

การใช้ฟังก์ชันนี้จะคล้ายกับกราฟเส้นธรรมดาที่ใช้ฟังก์ชัน plot วาด แต่จะมีคีย์เวิร์ดต่างไปบ้าง คีย์เวิร์ดสำคัญที่เพิ่มเข้ามาคือ xerr และ yerr คือค่าความคลาดเคลื่อนในแนวแกน x และ y

มาเริ่มลองวาดตัวอย่างดู ขอยกตัวอย่างแต่แถบความคลาดเคลื่อนในแนวแกน y แต่หากจะทำในแกน x ก็ทำได้ในลักษณะเดียวกัน

สมมุติว่าเรากำลังวิเคราะห์ข้อมูลการสั่นเป็นคาบของอะไรบางอย่างอยู่ แต่ข้อมูลนั้นมีสัญญาณรบกวน ดังนั้นก็ต้องใส่แถบความคลาดเคลื่อน
import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0,10,20)
noi = np.random.randn(20) # สร้างสัญญาณรบกวนด้วยการสุ่มโดยมีการแจกแจงแบบปกติ
y = 5*np.sin(x)+noi
plt.errorbar(x,y,yerr=y.std()) # ใช้ส่วนเบี่ยงเบนมาตรฐานเป็นความคลาดเคลื่อน
plt.show()



ค่าความคลาดเคลื่อนนั้นที่จริงไม่จำเป็นต้องเป็นค่าเดียวตลอด เพราะแต่ละช่วงก็อาจมีความคลาดเคลื่อนต่างกันออกไป

สามารถทำให้แถบความคลาดเคลื่อนมีค่าต่างกันได้โดยใส่ค่า yerr เป็นลิสต์หรืออาเรย์ที่มีความยาวเท่ากับจำนวนข้อมูล แทนที่จะเป็นค่าตัวเลขเดียว
x = np.linspace(0,10,20)
noi = np.random.randn(20)
y = 5*np.sin(x)+noi
plt.errorbar(x,y,c='r',yerr=np.abs(noi))
plt.show()





ปรับแถบความคลาดเคลื่อนสองด้านให้ต่างกัน
การปรับแถบความคลาดเคลื่อนในด้านน้อยและมากให้ไม่เท่ากันก็สามารถทำได้ด้วย โดยการใส่ค่าให้ yerr เป็นคู่อันดับของลิสต์ความคลาดเคลื่อน

เช่น สมมุติว่าเรารู้ว่าสัญญาณรบกวนมีค่าเป็นบวกเสมอก็อาจลองวาดแถบความคลาดเคลื่อนให้มีแค่ด้านล่าง ส่วนด้านบนเป็น 0
x = np.linspace(0,10,20)
noi = np.abs(np.random.randn(20))
y = 5*np.sin(x)+noi
plt.errorbar(x,y,c='g',yerr=[noi,np.zeros(20)])
plt.show()





แถบความคลาดเคลื่อนแบบลูกศรชี้ด้านเดียว
ในกรณีที่ต้องการแถบความคลาดเคลื่อนแค่ด้านเดียวแบบนี้อาจเลือกใช้คีย์เวิร์ด uplims กับ lolims

โดยถ้าตั้ง uplims=1 จะมีแถบความคลาดเคลื่อนแค่ด้านลบ และกลายเป็นลูกศร ถ้าตั้ง lolims=1 จะได้แถบความคลาดเคลื่อนแค่ด้านบวก

ลองใช้ uplims ดูกับกราฟในตัวอย่างที่แล้ว
x = np.linspace(0,10,20)
noi = np.abs(np.random.randn(20))
y = 5*np.sin(x)+noi
plt.errorbar(x,y,c='y',yerr=noi,uplims=1)
plt.show()



uplims กับ lolims สามารถใส่เป็นลิสต์ตามจำนวนของจุดในกราฟได้ แบบนี้ก็จะทำให้บางอันมีชี้ขึ้นบางอันมีชี้ลงได้

เช่น ลองกลับมาที่ตัวอย่างที่สัญญาณรบกวนเป็นทั้งบวกและลบ ลองตั้งให้มีการชี้ขึ้นเมื่อสัญญาณรบกวนเป็นบวก และชี้ลงเมื่อเป็นลบ
x = np.linspace(0,10,20)
noi = np.random.randn(20)
y = 5*np.sin(x)+noi
plt.errorbar(x,y,c='c',yerr=np.abs(noi),uplims=(noi>0),lolims=(noi<0))
plt.show()



กรณีที่ทั้ง uplims และ lolims เป็น 1 ทั้งคู่ก็จะได้ลูกศรทั้งสองด้าน เช่น ลองแก้บรรทัด errorbar เป็น
plt.errorbar(x,y,c='k',yerr=np.abs(noi),uplims=1,lolims=1)



ส่วนแกน x เองก็มีคีย์เวิร์ดที่คล้ายกัน คือ xlolims กับ xuplims สำหรับทำให้เป็นลูกศรไปทางซ้ายและขวา



ปรับแต่งแถบความคลาดเคลื่อน
ฟังก์ชัน errorbar นั้นสามารถใส่คีย์เวิร์ดส่วนใหญ่ที่ plot มี และยังเพิ่มคีย์เวิร์ดที่เกี่ยวกับการปรับแต่งแถบความคลาดเคลื่อนลงไปได้ ด้วย
ecolor สีของแถบความคลาดเคลื่อน
elinewidth ความหนาของเส้นแถบความคลาดเคลื่อน
capsize ความยาวของเส้นที่ปลายขอบของแถบความคลาดเคลื่อน

ตัวอย่าง
x = np.linspace(0,10,20)
noi = np.random.randn(20)
y = 5*np.sin(x)+noi
erb = plt.errorbar(x,y,c='#FFAA11',yerr=np.abs(noi),ecolor='#FF2222',capsize=12,elinewidth=4)
plt.show()





การปรับเส้นที่ปลายแถบความคลาดเคลื่อน
จากตัวอย่างที่แล้วจะเห็นว่าเส้นแถบความคลาดเคลื่อนเปลี่ยนสีและหนาขึ้น ส่วนความยาวเส้นที่ปลายก็ยาวขึ้น

แต่ว่าความหนาของเส้นที่ปลายนั้นไม่ได้เปลี่ยนไปด้วย การจะเปลี่ยนตรงส่วนนี้ไม่สามารถทำได้ด้วยการใส่คีย์เวิร์ดในฟังก์ชัน errobar ต้องมาปรับทีหลัง

เวลาที่ใช้ฟังก์ชัน errorbar ถ้าเอาตัวแปรมารับจะได้ค่าคืนกลับ ซึ่งเป็นลิสต์ที่มีออบเจ็กต์ ๓ อย่างอยู่ โดยตัวแรกคือออบเจ็กต์ของตัวเส้นกราฟ ตัวที่สองคือออบเจ็กต์ของแถบความคลาดเคลื่อน

ออบเจ็กต์ของแถบ ความคลาดเคลื่อนเป็นลิสต์ที่เก็บแถบความคลาดเคลื่อนทั้งหมดไว้ โดยแถบความคลาดเคลื่อนด้านบนและล่าง (แกน y) คิดเป็นอย่างละออบเจ็กต์ ถ้ามีการตั้ง xerr ด้วยก็จะมีแถบความคลาดเคลื่อนด้านซ้ายขวาอีกอย่างละอัน รวมเป็น ๔ ออบเจ็กต์

ในที่นี้เราใช้แค่ความคลาดเคลื่อนในแนวแกน y จึงมีแค่ ๒ ออบเจ็กต์

ลองแก้เป็นแบบนี้
x = np.linspace(0,10,20)
noi = np.random.randn(20)
y = 5*np.sin(x)+noi
erb = plt.errorbar(x,y,c='#669966',yerr=np.abs(noi),ecolor='r',capsize=12,elinewidth=4)
erb[1][0].set_markeredgewidth(4)
erb[1][0].set_color('y')
erb[1][1].set_markeredgewidth(4)
erb[1][1].set_color('c')
plt.show()



จะเห็นว่าเอาตัวแปร erb มารับออบเจ็กต์ทั้งหมดจากฟังก์ชัน errorbar ออบเจ็กต์ตัวที่สองคือ erb[1] ก็คือลิสต์ของแถบความคลาดเคลื่อน ซึ่งข้างในก็ประกอบไปด้วย ๒ อัน คือแถบด้านล่าง erb[1][0] และ erb[1][1] แถบด้านบน

ในที่นี้จึงใช้ set_markeredgewidth เพื่อปรับความหนาของเส้น และ set_color เพื่อเปลี่ยนสี



แผนภูมิแท่งกับแถบความคลาดเคลื่อน
แผนภูมิ แท่งเองก็สามารถเติมแถบความคลาดเคลื่อนได้ และสามารถทำได้ง่ายกว่าเพราะไม่ต้องเปลี่ยนฟังก์ชันที่ใช้ ภายในฟังก์ชัน bar หรือ barh นั้นมีคีย์เวิร์ด xerr และ yerr รวมถึง ecolor อยู่
x = np.linspace(0,11,40)
noi = np.random.randn(40)
y = 5*np.sin(x)+noi
erb = plt.bar(x,y,color='#EEEEFF',yerr=np.abs(noi),ecolor='#AA11AA',capsize=24,width=0.25,ec='k')
plt.show()





อ้างอิง


<< บทที่แล้ว     บทถัดไป >>
หน้าสารบัญ


-----------------------------------------

囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧

ดูสถิติของหน้านี้

หมวดหมู่

-- คอมพิวเตอร์ >> เขียนโปรแกรม >> python >> matplotlib

ไม่อนุญาตให้นำเนื้อหาของบทความไปลงที่อื่นโดยไม่ได้ขออนุญาตโดยเด็ดขาด หากต้องการนำบางส่วนไปลงสามารถทำได้โดยต้องไม่ใช่การก๊อปแปะแต่ให้เปลี่ยนคำพูดเป็นของตัวเอง หรือไม่ก็เขียนในลักษณะการยกข้อความอ้างอิง และไม่ว่ากรณีไหนก็ตาม ต้องให้เครดิตพร้อมใส่ลิงก์ของทุกบทความที่มีการใช้เนื้อหาเสมอ

สารบัญ

รวมคำแปลวลีเด็ดจากญี่ปุ่น
มอดูลต่างๆ
-- numpy
-- matplotlib

-- pandas
-- manim
-- opencv
-- pyqt
-- pytorch
การเรียนรู้ของเครื่อง
-- โครงข่าย
     ประสาทเทียม
ภาษา javascript
ภาษา mongol
ภาษาศาสตร์
maya
ความน่าจะเป็น
บันทึกในญี่ปุ่น
บันทึกในจีน
-- บันทึกในปักกิ่ง
-- บันทึกในฮ่องกง
-- บันทึกในมาเก๊า
บันทึกในไต้หวัน
บันทึกในยุโรปเหนือ
บันทึกในประเทศอื่นๆ
qiita
บทความอื่นๆ

บทความแบ่งตามหมวด



ติดตามอัปเดตของบล็อกได้ที่แฟนเพจ

  ค้นหาบทความ

  บทความแนะนำ

ตัวอักษรกรีกและเปรียบเทียบการใช้งานในภาษากรีกโบราณและกรีกสมัยใหม่
ที่มาของอักษรไทยและความเกี่ยวพันกับอักษรอื่นๆในตระกูลอักษรพราหมี
การสร้างแบบจำลองสามมิติเป็นไฟล์ .obj วิธีการอย่างง่ายที่ไม่ว่าใครก็ลองทำได้ทันที
รวมรายชื่อนักร้องเพลงกวางตุ้ง
ภาษาจีนแบ่งเป็นสำเนียงอะไรบ้าง มีความแตกต่างกันมากแค่ไหน
ทำความเข้าใจระบอบประชาธิปไตยจากประวัติศาสตร์ความเป็นมา
เรียนรู้วิธีการใช้ regular expression (regex)
การใช้ unix shell เบื้องต้น ใน linux และ mac
g ในภาษาญี่ปุ่นออกเสียง "ก" หรือ "ง" กันแน่
ทำความรู้จักกับปัญญาประดิษฐ์และการเรียนรู้ของเครื่อง
ค้นพบระบบดาวเคราะห์ ๘ ดวง เบื้องหลังความสำเร็จคือปัญญาประดิษฐ์ (AI)
หอดูดาวโบราณปักกิ่ง ตอนที่ ๑: แท่นสังเกตการณ์และสวนดอกไม้
พิพิธภัณฑ์สถาปัตยกรรมโบราณปักกิ่ง
เที่ยวเมืองตานตง ล่องเรือในน่านน้ำเกาหลีเหนือ
ตระเวนเที่ยวตามรอยฉากของอนิเมะในญี่ปุ่น
เที่ยวชมหอดูดาวที่ฐานสังเกตการณ์ซิงหลง
ทำไมจึงไม่ควรเขียนวรรณยุกต์เวลาทับศัพท์ภาษาต่างประเทศ

บทความแต่ละเดือน

2024年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2023年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2022年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2021年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2020年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

ค้นบทความเก่ากว่านั้น

ไทย

日本語

中文