การสร้าง 2D Animation เป็นความสามารถอีกด้านหนึ่งของ Matplotlib นอกเหนือจากการสร้างแผนภาพแบบต่าง ๆ 2D Animation ในแบบของ Matplotlib ไม่ได้หมายถึงการสร้างภาพเคลื่อนไหวแบบการสร้างการ์ตูน แต่เป็นการสร้างภาพเคลื่อนไหวเพื่อให้การสื่อสารด้วยแผนภาพนั้นชัดเจนมากขึ้น
ในตอนนี้จะยกตัวอย่างการสร้างภาพเคลื่อนไหวด้วยการเปลี่ยนขนาดของวงกลม โดยมีขั้นตอนดังนี้
1. นำเข้า Module
from matplotlib import pyplot as plt
from matplotlib import animation
module ที่ต้องใช้คือ pyplot (กำหนดให้ใช้ชื่อ plt เพื่อความสะดวก) และ animation ซึ่งจะช่วยในการวาดภาพทีละเฟรมเพื่อให้มองดูเป็นภาพเคลื่อนไหว2. สร้างพื้นที่สำหรับวาด
fig = plt.figure()
ax = plt.axes(xlim=(-10, 10), ylim=(-10, 10))
ax.set_aspect('equal')
circle = create_circle()
ax.add_patch(circle)
ax.axis('off')
- คำสั่ง fig = plt.figure() คือการบอกให้ pyplot (module ที่นำเข้ามา) สร้างรูป (figure) ขึ้นมา
- คำสั่ง ax = plt.axes(xlim=(-10,10), ylim(-10,10)) คือการกำหนดให้แกน X และ Y แสดงจำนวนตั้งแต่ -10 ถึง 10 ซึ่งก็คือการกำหนดขนาดพื้นที่นั่นเอง
- คำสั่ง ax.set_aspect('equal') คือการกำหนดให้ขนาดของแกน X และแกน Y มีอัตราส่วนเท่ากัน
- circle = create_circle() คือการสร้างวงกลมขึ้นมาแล้วเก็บไว้ตัวแปรชื่อ circle โดยการเรียกใช้ function ชื่อ create_circle()
- ax.add_pacth(circle) patch ในที่นี้หมายถึงพื้นที่สี่เหลี่ยมเพื่อใช้ในการวาด การใช้ add_patch() จึงเป็นบอกให้ทราบถึงพื้นที่ที่จะใช้วาดและนำมาแสดง ซึ่งตำแหน่งที่แสดงจะต้องอ้างอิงจากแกน (axe)
- ax.axis('off') บอกให้ pyplot ไม่ต้องวาดเส้นแสดงแกน X และ Y ให้เห็นบนหน้าจอ
def create_circle():
circle = plt.Circle((0, 0), 0.05)
return circle
create_circle() เป็น function ที่ทำหน้าที่สร้าง instance ของ Patch หนึ่งซึ่งทำหน้าที่ในการวาดวงกลม [2] สังเกตุว่า function นี้มีการ return object ที่สร้างชึ้นมา
4. ปรับค่ารัศมีวงกลม
def update_radius(i, circle):
circle.radius = i*0.1
return circle,
หน้าที่ของ function นี้คือการปรับค่า radius ของวงกลมที่รับเข้ามาในรูปของตัวแปรชื่อ circle ในการปรับค่านั้นจะสัมพันธ์กับค่าของ i ที่รับเข้ามา ค่าของ i นั้นคือค่าตำแหน่งของ frame ภาพที่กำลังจะทำการวาด จากสมการ circle.radius = i*0.1 จะเห็นได้ว่าค่าของ radius ของวงกลมจะใหญ่ขึ้นเมื่อค่าตำแหน่งของ frame มากขึ้น เมื่อปรับค่าของ radius แล้วก็ส่ง object circle คืนออกไป5. สร้าง Animation
anim = animation.FuncAnimation(
fig=fig,
func=update_radius,
fargs=(circle,),
frames=30,
interval=50,
blit=True)
plt.title('Simple Circle Animation')
plt.show()
ทำได้โดยอาศัย FuncAnimation() จาก animation module[3] parameter ที่กำหนดให้มีดังนี้
- fig คือ figure หรือ object ที่ระบุถึงรูปภาพ
- func คือ ชื่อ function ที่จะถูกเรียกใช้งานเพื่อวาดภาพในแต่ละเฟรม
- fargs คือ parameter ที่จะส่งให้กับ func ซึ่งต้องกำหนดให้อยู่ในรูปแบบของ List (ในกรณีนี้คือ circle)
- frames คือ แหล่งข้อมูลที่จะส่งให้กับ func ในกรณีนี้กำหนดให้เป็น integer 30 ซึ่งจะถูกตีความว่าให้ส่งค่าตัวเลขตั้งแต่ 0 - 29 ไปให้ func (ในกรณีนี้คือ i)
- interval คือ delay time ระหว่าง frame หน่วยเป็น milliseconds
- blit เป็น option ถ้ากำหนดให้เป็น True จะเป็นการระบุให้มีการวาดภาพแบบ optimize ข้อดีคือการเคลื่อนไหวจะดูนุ่นนวล ข้อเสียคือใช้ทรัพยากรเพิ่มขึ้น
Full Script
from matplotlib import pyplot as plt
from matplotlib import animation
def create_circle():
circle = plt.Circle((0, 0), 0.05)
return circle
def update_radius(i, circle):
circle.radius = i*0.1
return circle,
fig = plt.figure()
ax = plt.axes(xlim=(-10, 10), ylim=(-10, 10))
ax.set_aspect('equal')
circle = create_circle()
ax.add_patch(circle)
ax.axis('off')
anim = animation.FuncAnimation(
fig=fig,
func = update_radius,
fargs = (circle,),
frames=30,
interval=50,
blit=True)
plt.title('Simple Circle Animation')
plt.show()
ผลที่ได้คือ
ดังที่ได้กล่าวในตอนต้นว่า การสร้าง animation ด้วย matplotlib ก็เพื่อเพิ่มสะดวกในการทำความเข้าใจในการเรียนรู้ด้วยด้วยภาษา Python ในตอนต่อไปจะกล่าวถึงการประยุกต์เพื่อนำไปใช้ในการเรียนเรื่องการเคลื่อนที่ ครับ
เอกสารอ้างอิง
[1] https://en.wikipedia.org/wiki/Animation[2] https://matplotlib.org/api/_as_gen/matplotlib.patches.Circle.html#matplotlib.patches.Circle
[3] https://matplotlib.org/api/_as_gen/matplotlib.animation.FuncAnimation.html?highlight=funcanimation
Sign up here with your email
ConversionConversion EmoticonEmoticon