เวลาวาดกราฟเราอาจต้องการใส่คำอธิบายอะไรลงไปเพิ่มเติม
เรื่องของการใส่ชื่อแกนและหัวข้อได้อธิบายไว้ตั้งแต่ใน
บทที่ ๘ แต่ในบทนี้จะมาอธิบายเพิ่มเติมถึงการใส่ข้อความในส่วนอื่นๆ
การใส่ข้อความลงตรงไหนก็ได้ในกราฟ คำสั่งที่ใช้ใส่ข้อความเพิ่มลงตรงส่วนไหนก็ได้ในกราฟคือ plt.text หรือจะใช้ในรูปเมธอดที่กระทำต่อ axes คือเขียนเป็น ax.text ก็ได้
อาร์กิวเมนต์ที่ต้องใส่คือตำแหน่งพิกัดในแกน x ตามด้วยในแกน y แล้วจึงตามด้วยข้อความที่ต้องการใส่
ตัวอย่าง
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-20,20,401)
y = np.sin(x)*x
plt.plot(x,y)
plt.text(0,10,'numpy\nmatplotlib')
plt.show()
ก็จะได้ว่ามีข้อความปรากฏขึ้นมาบนกราฟ
หากเราไม่ได้ตั้งอะไรตำแหน่งพิกัดนั้นจะตรงกับมุมซ้ายล่างของข้อความ แต่เราสามารถปรับการจัดเรียงตามแนวตั้งได้โดยเพิ่มคีย์เวิร์ด verticalalignment หรือเขียนว่าเป็น va ค่าที่ใส่ได้คือ top, bottom, center และ baseline ค่าตั้งต้นคือ baseline
และแนวนอนปรับด้วย horizontalalignment หรือย่อเป็น ha ค่าที่ใส่ได้คือ center, right และ left ค่าตั้งต้นคือ left
ส่วนขนาดของตัวอักษรก็ปรับได้โดยคีย์เวิร์ด fontsize ชนิดฟอนต์เปลี่ยนได้โดยคีย์เวิร์ด fontname
นอกจากนี้ก็มี เช่น สีปรับด้วยคีย์เวิร์ด color ปรับความโปร่งใสด้วยคีย์เวิร์ด alpha ปรับมุมเอียงด้วยคีย์เวิร์ด rotation
ตัวอย่าง
x = np.linspace(-40,40,401)
y = np.cos(x)*x**2
plt.plot(x,y,lw=2)
plt.text(0,500,u'นุมไพ\nแม็ตพล็อตลิบ',ha='center',va='center',fontsize=25,fontname='Tahoma',color='#11AA00',rotation=5)
plt.show()
และ เช่นเดียวกับ xlabel, ylabel, title และ legend เราสามารถกำหนดรูปแบบของอักษรได้ด้วยออบเจ็กต์ FontProperties โดยใส่ในคีย์เวิร์ด fontproperties (รายละเอียดใน
บทที่ ๘)
สรุปคีย์เวิร์ดต่างๆที่สามารถตั้งได้
verticalalignment หรือ va |
การจัดเรียงในแนวตั้ง |
horizontalalignment หรือ ha |
การจัดเรียงในแนวนอน |
color |
สี |
alpha |
ความโปร่งใส |
fontsize |
ขนาดอักษร |
fontname |
ชนิดฟอนต์ |
style |
กำหนดว่าเป็นตัวเอียงหรือตัวปกติ |
weight |
ความหนาของตัวอักษร |
fontproperties |
คุณสมบัติของฟอนต์ |
rotation |
มุมเอียง |
bbox |
กำหนดกรอบล้อมข้อความ |
การใส่กรอบล้อมข้อความ ข้อความที่สร้างขึ้นจากฟังก์ชัน plt.text สามารถใส่กรอบได้โดยใส่คีย์เวิร์ด bbox
ค่าที่ใส่ต้องอยู่ในรูปของดิกชันนารีซึ่งประกอบด้วยคู่ของชื่อคุณสมบัติและค่าของ คุณสมบัตินั้น คุณสมบัตินั้นคือค่าต่างๆที่ต้องการตั้งให้กับตัวกรอบ ได้แก
ชื่อ |
ชื่อย่อ |
ความหมาย |
facecolor |
fc |
สีพื้น |
alpha |
|
ความโปร่งใส |
pad |
|
ระยะห่างระหว่างตัวหนังสือด้านในกับขอบกรอบ |
linewidth |
lw |
ความกว้างเส้นขอบ |
linestyle |
ls |
รูปแบบเส้นขอบ |
edgecolor |
ec |
สีเส้นขอบ |
boxstyle |
|
รูปแบบกรอบ |
ตัวอย่าง
x = np.linspace(-10,10,501)
y = np.sinc(x)
plt.plot(x,y,'r',lw=3)
bbox = {'fc':'#001177','alpha':0.8,'pad':10,'lw':5,'ls':'--'}
plt.text(1,1,u'นุมไพ\nแม็ตพล็อตลิบ',bbox=bbox,va='top',fontsize=26,fontname='Tahoma',color='#11AA00')
plt.show()
boxstyle เป็นตัวกำหนดรูปแบบกรอบ ที่ใส่ได้ก็มีอยู่ ๙ แบบ ได้แก่ circle, darrow, larrow, rarrow, round, round4, roundtooth, sawtooth และ square โดยรูปแบบตั้งต้นคือ square คือเป็นกรอบสี่เหลี่ยมธรรมดา
ลองวาดแบบต่างๆตามนี้ แล้วดูรูปเทียบ
plt.axes(xlim=[-20,20],ylim=[-15,15],aspect=1)
bstyle = ['circle','darrow','larrow','rarrow','round','round4','roundtooth','sawtooth']
for i,bs in enumerate(bstyle):
bbox = {'fc':'#771133','alpha':0.3,'boxstyle':bs}
plt.text(-10+np.floor(i/4)*20,11-i*8+np.floor(i/4)*32,bs,bbox=bbox,ha='center',fontsize=19,color='#3377AA')
plt.show()
การใส่ข้อความพร้อมลูกศร บ่อยครั้งที่เราใส่ข้อความลงไปในกราฟหรือแผนภาพเพื่อเป็นตัวชี้อธิบายอะไรบาง อย่างภายในนั้น กรณีแบบนี้นอกจากจะมีตัวหนังสือแล้วถ้ามีลูกศรชี้ด้วยก็จะเห็นภาพชัดขึ้น
matplotlib ได้จัดเตรียมคำสั่งสำหรับสร้างข้อความขึ้นมาพร้อมกับหัวลูกศรเสร็จในทีเดียว เลย นั่นคือฟังก์ชัน plt.annotate หรือเขียนในรูปเมธอดของ axes เป็น ax.annotate ก็ได้
อาร์กิวเมนต์ที่ต้องใช้สำหรับฟังก์ชันนี้มี ๓ ตัว คือ (ข้อความ, ตำแหน่งปลายลูกศร, ตำแหน่งข้อความ) โดยตำแหน่งใส่เป็นคู่อันดับ x,y
ส่วนคีย์เวิร์ดที่ใส่ได้นั้นในส่วนที่ใช้ปรับข้อความและกรอบข้อความนั้นจะเหมือน กับของ plt.text เช่น color, alpha, fontsize, fontname, bbox, ฯลฯ
ที่เพิ่มเข้ามาจะเป็นคีย์เวิร์ดที่เกี่ยวกับการปรับแต่งลูกศร เช่น arrowprops
arrowprops |
เวลาเขียนต้องเขียนในรูปดิกชันนารีของชื่อคุณสมบัติและค่าที่ต้องการ ค่าที่ใส่ได้ได้แก่ |
arrowstyle |
ลักษณะของลูกศร |
connectionstyle |
ลักษณะการโยงเชื่อมลูกศร |
color |
สีของเส้น |
linewidth หรือ lw |
ความกว้างของเส้น |
linestyle หรือ ls |
รูปแบบของเส้น |
ตัวอย่าง ลองใช้ลูกศรเพื่อชี้ตำแหน่งจุดสูงสุดของกราฟ
x = np.linspace(-20,20,501)
y = (np.cos(x*10)+np.cos(x*11))**2*np.exp(-x**2/100)
xmax = x[y.argmax()]
ymax = y.max()
plt.ylim([0,ymax+1])
plt.plot(x,y,'#007799')
arrowprops = {'arrowstyle':'->','color':'r'}
plt.annotate(u'จุดยอด',[xmax,ymax],[xmax+1,ymax+0.5],fontsize=20,fontname='Tahoma',arrowprops=arrowprops)
plt.show()
สำหรับ arrowstyle นั้นสามารถเลือกได้หลายรูปแบบ ดังนี้
plt.axes(xlim=[-20,20],ylim=[-15,15],aspect=1)
arrowstyle = ['-','->','<-','<->','-|>','<|-','<|-|>','-[','|-|','fancy','simple','wedge']
for i,ars in enumerate(arrowstyle):
plt.annotate(ars,[18,-14+i*2.5],[-12,14-i*2.5],va='center',ha='right',color='r',fontsize=14,arrowprops={'arrowstyle':ars})
plt.show()
การใส่ข้อความบนเส้นกราฟ เราสามารถประยุกต์ใช้จุดลูกศรเพื่อให้บอกตำแหน่งต่างๆบนกราฟได้
ตัวอย่าง การใส่ลูกศรพร้อมข้อความประกอบทุกจุดบนกราฟยกเว้นที่ปลาย
plt.axes(ylim=[0,12])
x = np.linspace(-2,2,21)
y = np.exp(-x**2)*10
plt.plot(x,y,'r-o')
arp = {'arrowstyle':'->','color':'g'}
for i in range(1,20):
plt.annotate('%.3f'%y[i],[x[i],y[i]],[x[i],y[i]+1],color='m',ha='center',arrowprops=arp)
plt.show()
ตัวอย่างการใส่ตัวเลขบอกแค่บางจุดบนกราฟ
plt.axes(ylim=[0,12])
x = np.linspace(-2,2,1001)
y = np.exp(-x**2)*np.cos(x*np.pi*2.5)**2*10
plt.plot(x,y,'#AA2244',lw=2)
xa = x[np.arange(0,1001,100)]
ya = y[np.arange(0,1001,100)]
arp = {'arrowstyle':'fancy','color':'#AA1199'}
for i in range(1,10):
plt.annotate('%.3f'%ya[i],[xa[i],ya[i]],[xa[i]*1.2,ya[i]+1],fontsize=12,color='#11AA33',arrowprops=arp)
plt.show()
การวางตัวหนังสือวางเลียบตามแนวกราฟ
x = np.linspace(-2,2,1001)
y = np.sin(x*np.pi*2.5)-x*4
plt.axes(ylim=[-16,16])
plt.plot(x,y,'#22AA33',ls='--',lw=4)
xa = x[np.arange(50,1001,100)]
ya = y[np.arange(50,1001,100)]
text = 'matplotlib'
for i in range(10):
plt.text(xa[i],ya[i],text[i],va='bottom',ha='center',fontsize=30,color='c',rotation=-15)
plt.show()
อ้างอิง