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



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



การวาดกราฟเส้นที่มีความคลาดเคลื่อน
กราฟที่มีแถบความคลาดเคลื่อนสามารถวาดได้โดยใช้ฟังก์ชัน 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

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

สารบัญ

รวมคำแปลวลีเด็ดจากญี่ปุ่น
python
-- numpy
-- matplotlib

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

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



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

  ค้นหาบทความ

  บทความแนะนำ

หลักการเขียนทับศัพท์ภาษาจีนกวางตุ้ง
การใช้ unix shell เบื้องต้น ใน linux และ mac
หลักการเขียนทับศัพท์ภาษาจีนกลาง
g ในภาษาญี่ปุ่นออกเสียง "ก" หรือ "ง" กันแน่
ทำความรู้จักกับปัญญาประดิษฐ์และการเรียนรู้ของเครื่อง
ค้นพบระบบดาวเคราะห์ ๘ ดวง เบื้องหลังความสำเร็จคือปัญญาประดิษฐ์ (AI)
หอดูดาวโบราณปักกิ่ง ตอนที่ ๑: แท่นสังเกตการณ์และสวนดอกไม้
พิพิธภัณฑ์สถาปัตยกรรมโบราณปักกิ่ง
เที่ยวเมืองตานตง ล่องเรือในน่านน้ำเกาหลีเหนือ
บันทึกการเที่ยวสวีเดน 1-12 พ.ค. 2014
แนะนำองค์การวิจัยและพัฒนาการสำรวจอวกาศญี่ปุ่น (JAXA)
เล่าประสบการณ์ค่ายอบรมวิชาการทางดาราศาสตร์โดยโซวเคนได 10 - 16 พ.ย. 2013
ตระเวนเที่ยวตามรอยฉากของอนิเมะในญี่ปุ่น
เที่ยวชมหอดูดาวที่ฐานสังเกตการณ์ซิงหลง
บันทึกการเที่ยวญี่ปุ่นครั้งแรกในชีวิต - ทุกอย่างเริ่มต้นที่สนามบินนานาชาติคันไซ
หลักการเขียนทับศัพท์ภาษาญี่ปุ่น
ทำไมจึงไม่ควรเขียนวรรณยุกต์เวลาทับศัพท์ภาษาต่างประเทศ
ทำไมถึงอยากมาเรียนต่อนอก
เหตุผลอะไรที่ต้องใช้ภาษาวิบัติ?

ไทย

日本語

中文