ใน
บทที่ ๒๐ ได้วาดกราฟไม้ขีดไฟซึ่งสามารถทำให้กราฟดูเหมือนมีการเติมอะไรมากขึ้นไม่ดูโล่งๆ ใช้เวลาแสดงพื้นที่ใต้กราฟได้
ต่อ มาคราวนี้มาดูกราฟอีกรูปแบบที่อาจใช้งานได้ดีกว่า นั่นคือใช้ฟังก์ชัน 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()
อ้างอิง