กราฟเส้นโดยทั่วไปนั้นจะมีแค่การลากเส้นระหว่างจุดกับจุดไปเรื่อยๆเท่านั้น ส่วนที่เหลือจะดูโล่งๆ
แต่ในบางครั้งเราอาจจะอยากมองเห็นภาพความสัมพันธ์ระหว่างค่าบนกราฟกับเส้นแกน ในกรณีแบบนั้นกราฟไม้ขีดไฟอาจเป็นตัวเลือกที่ดี
กราฟไม้ขีดไฟคือกราฟที่มีลักษณะเป็นแท่งๆลากจากเส้นแกนมายังจุดบนกราฟ ใน matplotlib สามารถสร้างขึ้นได้จากฟังก์ชัน plt.stem
ตัวอย่างการใช้เบื้องต้น
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(50)
y = np.sin(x/5.)**2+0.5
plt.stem(x,y)
plt.show()
จะเห็นว่าเส้นลากจากแกนมายังจุดบนกราฟ แต่ว่าไม่มีเส้นกราฟมีแต่จุดปรากฏ
แต่เราสามารถใส่เส้นกราฟเข้าไปได้โดยใช้คีย์เวิร์ด markerfmt ใส่รูปแบบเส้น รูปแบบจุด และสีลงไปได้ตรงนี้
x = np.arange(100)
y = np.sin(x/5.)
plt.stem(x,y,markerfmt='-r')
plt.show()
พอทำแบบนี้แล้วทำให้ดูแล้วคล้ายกับเวลาที่เขียนรูปเพื่อแสดงพื้นที่ใต้กราฟ สามารถนำมาใช้
ส่วนรูปแบบของเส้นก้านไม้ขีดก็สามารถกำหนดได้ด้วยคีย์เวิร์ด linefmt เพียงแต่ว่าหากไม่ได้กำหนดสีด้วยจะออกมาเป็นเส้นหลากสี และหากกำหนดรูปแบบของจุดจะได้จุดออกมาทั้งสองด้าน
x = np.arange(20)
y = np.cos(x/4.)
plt.stem(x,y,linefmt=':D',markerfmt='-r')
plt.show()
ดังนั้นถ้าไม่อยากให้ออกมาหลากสีก็ควรกำหนดสีให้เส้นไม้ขีดด้วย และถ้าอยากให้จุดมีแค่ที่ปลายไม่มีที่ฐานก็ให้กำหนดรูปแบบจุดที่ส่วนของ markerfmt แทน
เส้นที่ฐานสามารถเปลี่ยนรูปแบบได้เช่นกันด้วย คีย์เวิร์ด basefmt นอกจากนี้ยังสามารถย้ายตำแหน่งได้ด้วยคีย์เวิร์ด bottom ไม่จำเป็นจะต้องอยู่ที่ตำแหน่ง 0 ตลอด
x = np.arange(80)
y = np.cos(x)+np.cos(x*1.1)
plt.stem(x,y,linefmt=':c',markerfmt='-ro',basefmt='.-m',bottom=-2.5)
plt.show()
เพียงแต่ว่าหากต้องการเปลี่ยนรูปแบบให้หลากหลายกว่านี้จะต้องมาปรับค่าในภายหลัง
เวลาที่ใช้ฟังก์ชัน plt.stem หากนำตัวแปรมารับค่าจะได้ค่าคืนกลับเป็นลิสต์ของออบเจ็กต์ ๓ ตัว คือของเส้นกราฟ, เส้นไม้ขีด, และเส้นฐาน ตามลำดับ
หากเราเอาตัวแปร ๓ ตัวมารับเราก็จะสามารถปรับค่าของแต่ละตัวได้โดยใช้ฟังก์ชัน plt.setp ค่าที่สามารถปรับได้ก็จะคล้ายๆค่าที่ปรับได้ในกราฟเส้นธรรมดา
linewidth หรือ lw |
ความหนาของเส้น |
linestyle หรือ ls |
รูปแบบของเส้น |
marker |
รูปแบบของจุด |
markersize หรือ ms |
ขนาดของจุด |
color หรือ c |
สีของเส้น |
ตัวอย่าง
x = np.linspace(0,10,40)
y = np.sin(x*2)+np.cos(x*2.1)+3
sengraph, senmaikhit, senthan = plt.stem(x,y,bottom=2.25)
plt.setp(sengraph, lw=5,ls=':',c='#558800',marker='d',ms=10)
plt.setp(senmaikhit, linewidth=2,c='#CC2233',marker='')
plt.setp(senthan, linewidth=6,c='#005522')
plt.show()
เส้นไม้ขีดแต่ละเส้นเป็นออบเจ็กต์แยกคนละชิ้นกัน หากอยากปรับให้แต่ละอันต่างกันก็สามารถใช้ for วนซ้ำเพื่อปรับแก้ค่าทีละเส้นได้
นอกจากนี้ส่วนใหญก็คล้ายกราฟเส้นโค้ง สามารถใส่ label กับ legend ได้
ลองวาดสองกราฟพร้อมกันแล้วตั้งค่าต่างๆ ฟังก์ชัน setp สามารถใส่เป็นลิสต์เพื่อตั้งค่าพร้อมกันทีเดียวได้
x = np.linspace(0,10,50)
y1 = np.sin(x*3)+np.sin(x*3.2)+3
y2 = np.cos(x*3)+np.cos(x*3.3)-3
sengraph1, senmaikhit1, senthan1 = plt.stem(x,y1,label='$sin(3x)+sin(3.2x)+3$')
sengraph2, senmaikhit2, senthan2 = plt.stem(x,y2,label='$cos(3x)+cos(3.3x)-3$')
plt.setp(sengraph1, lw=5,ls=':',c='#998800',marker='d',ms=10)
plt.setp(sengraph2, lw=5,ls=':',c='#008899',marker='d',ms=10)
plt.setp([senmaikhit1,senmaikhit2], linewidth=2,c='#CC9932',marker='')
plt.setp([senthan1,senthan2], linewidth=6,c='#005592')
plt.legend(loc=7)
plt.show()
อ้างอิง