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



numpy & matplotlib เบื้องต้น บทที่ ๓๕: การเพิ่มคำอธิบายลงบนกราฟ
เขียนเมื่อ 2016/06/25 22:47
แก้ไขล่าสุด 2022/07/21 20:38
เวลาวาดกราฟเราอาจต้องการใส่คำอธิบายอะไรลงไปเพิ่มเติม

เรื่องของการใส่ชื่อแกนและหัวข้อได้อธิบายไว้ตั้งแต่ในบทที่ ๘ แต่ในบทนี้จะมาอธิบายเพิ่มเติมถึงการใส่ข้อความในส่วนอื่นๆ



การใส่ข้อความลงตรงไหนก็ได้ในกราฟ
คำสั่งที่ใช้ใส่ข้อความเพิ่มลงตรงส่วนไหนก็ได้ในกราฟคือ 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()





อ้างอิง


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


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

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

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

หมวดหมู่

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

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

สารบัญ

รวมคำแปลวลีเด็ดจากญี่ปุ่น
มอดูลต่างๆ
-- numpy
-- matplotlib

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

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



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

  ค้นหาบทความ

  บทความแนะนำ

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

บทความแต่ละเดือน

2024年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2023年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2022年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2021年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

2020年

1月 2月 3月 4月
5月 6月 7月 8月
9月 10月 11月 12月

ค้นบทความเก่ากว่านั้น

ไทย

日本語

中文