φυβλαςのβλογ
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
蒙古语
语言学
maya
概率论
与日本相关的日记
与中国相关的日记
-- 与北京相关的日记
-- 与香港相关的日记
-- 与澳门相关的日记
与台湾相关的日记
与北欧相关的日记
与其他国家相关的日记
qiita
其他日志

按类别分日志



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

  查看日志

  推荐日志

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