การสร้าง 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