φυβλαςのβλογ
phyblasのブログ



numpy & matplotlib เบื้องต้น บทที่ ๒๒: ระบายสีพื้นระหว่างเส้นกราฟ
เขียนเมื่อ 2016/06/12 01:25
แก้ไขล่าสุด 2021/09/28 16:42
ในบทที่ ๒๐ ได้วาดกราฟไม้ขีดไฟซึ่งสามารถทำให้กราฟดูเหมือนมีการเติมอะไรมากขึ้นไม่ดูโล่งๆ ใช้เวลาแสดงพื้นที่ใต้กราฟได้

ต่อ มาคราวนี้มาดูกราฟอีกรูปแบบที่อาจใช้งานได้ดีกว่า นั่นคือใช้ฟังก์ชัน plt.fill_between เป็นฟังก์ชันที่มีไว้สร้างกราฟที่มีการระบายสีระหว่างกราฟสองเส้น



ระบายสีระหว่างเส้นกราฟกับแกน
ถ้าหากใส่ค่าในแกน x และ y ไปอย่างละอันผลที่ได้ก็คือกราฟที่มีการระบายสีระหว่างเส้นกราฟกับแกน x
import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0,8,101)
y = np.arctan(x)
plt.fill_between(x,y)
plt.show()





ระบายสีระหว่างเส้นกราฟ ๒ เส้น
ถ้าใส่อาร์กิวเมนต์ไป ๓ ตัว ตัวแรกเป็นค่าแกน x และถัดมาเป็นค่าในแกน y ของกราฟ ๒ เส้น จะเป็นการระบายสีระหว่างสองกราฟนั้น
x = np.linspace(0,1,51)
y1 = np.tan(x)
y2 = np.cos(x)
plt.fill_between(x,y1,y2)
plt.show()



สามารถเปลี่ยนสีพื้นได้โดยใส่คีย์เวิร์ด facecolor และใส่สีเส้นขอบได้โดยใส่คีย์เวิร์ด edgecolor ส่วนความหนาของเส้นขอบก็เปลี่ยนได้ด้วยคีย์เวิร์ด linewidth หรือ lw
x = np.linspace(0,40,251)
y1 = np.sin(x)
y2 = np.sin(x/2)
plt.fill_between(x,y1,y2,facecolor='#EE8811',edgecolor='k',lw=4)
plt.show()





การตั้งเงื่อนไข
จะเห็นว่าถ้าโดยปกติไม่ว่ากราฟไหนจะมีค่ามากกว่าหรือน้อยกว่าก็ตามกราฟก็จะถูกระบายเหมือนกันหมด

แต่เราสามารถตั้งให้กราฟมีการระบายเฉพาะในบางเงื่อนไขได้ด้วยคีย์เวิร์ด where โดยใส่การเปรียบเทียบระหว่างค่าในแกน y ทั้ง ๒ เส้น

ตัวอย่าง ลองให้มีการระบายสีเมื่อเส้นหนึ่งสูงกว่าอีกเส้นเท่านั้น
x = np.linspace(0,40,251)
y1 = np.sin(x)
y2 = np.sin(x/10)
plt.fill_between(x,y1,y2,facecolor='#8844FF',where=y1>y2)
plt.show()



ถ้าลองวาด plt.fill_between ๒ อันโดยใช้เงื่อนไขตรงกันข้ามกันก็จะได้กราฟที่มีการสลับสีกันโดยขึ้นกับว่าค่าไหนมากกว่า
x = np.linspace(0,80,201)
y1 = np.sin(x)
y2 = np.sin(x/15)
plt.fill_between(x,y1,y2,where=y1<y2)
plt.fill_between(x,y1,y2,facecolor='m',where=y1>y2)
plt.show()



เงื่อนไขอาจจะเป็นอะไรก็ได้เช่น y มากกว่าค่าหนึ่งจึงระบาย
x = np.linspace(0,60,1501)
y = np.sin(x)+2
plt.fill_between(x,y,facecolor='m',where=(y>1.5))
plt.show()





การระบายพื้นที่ระหว่างกราฟ ๓ เส้นขึ้นไป
ปกติ plt.fill_between ใช้กับกราฟ ๒ เส้นเท่านั้น แต่ก็มีวิธีการที่จะทำให้ใช้กับกราฟ ๓ เส้นได้ นั่นคือใช้ฟังก์ชัน np.minimum และ np.maximum
x = np.linspace(0,8,201)
y1 = x**2
y2 = 100-x*10
y3 = 4*x**2
plt.fill_between(x,y1,np.minimum(y2,y3),facecolor='m')
plt.show()



ถ้ารวมกับตั้งเงื่อนไขแล้วก็จะสามารถสร้างพื้นจากบริเวณระหว่างเส้นกราฟได้
x = np.linspace(0,9,101)
y1 = (x-5)**2
y2 = 100-x*10
y3 = 4*x**2
y4 = np.minimum(y2,y3)
plt.fill_between(x,y1,y4,where=(y1<=y4))
plt.show()



และเมื่อใช้เส้นกราฟ ๔ อันก็สามารถทำพื้นที่สี่เหลี่ยมได้
x = np.linspace(-10,10,11)
y1 = x+8
y2 = x-8
y3 = -x+8
y4 = -x-8
y5 = np.minimum(y1,y3)
y6 = np.maximum(y2,y4)
plt.plot(x,y1)
plt.plot(x,y2)
plt.plot(x,y3)
plt.plot(x,y4)
plt.fill_between(x,y5,y6,where=(y5>=y6),color='#222222')
plt.show()





การระบายตามแนวนอน
ฟังก์ชัน fill_between นั้นมีไว้ระบายสีตามแนวแกน y แต่หากต้องการระบายตามแกน x จะต้องใช้ fill_between การใช้งานก็เหมือนกันแค่เปลี่ยนแกน

ตัวอย่าง
x = np.linspace(0,20,1001)
y11 = x-0.5+np.sin(x)
y12 = x+np.cos(x)
plt.fill_betweenx(x,y11,y12,where=(y11>=y12),color='#AA7700')
plt.fill_betweenx(x,y11,y12,where=(y11<y12),color='#77FF99')
plt.fill_betweenx(x,y11+5,y12+5,where=(y11>=y12),color='#77FF99')
plt.fill_betweenx(x,y11+5,y12+5,where=(y11<y12),color='#AA7700')
plt.show()





อ้างอิง


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


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

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

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

หมวดหมู่

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

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

目次

日本による名言集
モジュール
-- numpy
-- matplotlib

-- pandas
-- manim
-- opencv
-- pyqt
-- pytorch
機械学習
-- ニューラル
     ネットワーク
javascript
モンゴル語
言語学
maya
確率論
日本での日記
中国での日記
-- 北京での日記
-- 香港での日記
-- 澳門での日記
台灣での日記
北欧での日記
他の国での日記
qiita
その他の記事

記事の類別



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

  記事を検索

  おすすめの記事

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

ไทย

日本語

中文