การสร้าง 2D animation ด้วย Matplotlib

"Animation is a dynamic medium in which images or objects are manipulated to appear as moving images" [1]

การสร้าง 2D Animation เป็นความสามารถอีกด้านหนึ่งของ Matplotlib  นอกเหนือจากการสร้างแผนภาพแบบต่าง ๆ   2D Animation ในแบบของ Matplotlib ไม่ได้หมายถึงการสร้างภาพเคลื่อนไหวแบบการสร้างการ์ตูน แต่เป็นการสร้างภาพเคลื่อนไหวเพื่อให้การสื่อสารด้วยแผนภาพนั้นชัดเจนมากขึ้น

ในตอนนี้จะยกตัวอย่างการสร้างภาพเคลื่อนไหวด้วยการเปลี่ยนขนาดของวงกลม โดยมีขั้นตอนดังนี้




สร้าง Python Script

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')


  1. คำสั่ง fig = plt.figure() คือการบอกให้ pyplot (module ที่นำเข้ามา) สร้างรูป (figure) ขึ้นมา
  2. คำสั่ง ax = plt.axes(xlim=(-10,10), ylim(-10,10)) คือการกำหนดให้แกน X และ Y แสดงจำนวนตั้งแต่ -10 ถึง 10 ซึ่งก็คือการกำหนดขนาดพื้นที่นั่นเอง 
  3. คำสั่ง ax.set_aspect('equal') คือการกำหนดให้ขนาดของแกน X และแกน Y มีอัตราส่วนเท่ากัน
  4. circle = create_circle() คือการสร้างวงกลมขึ้นมาแล้วเก็บไว้ตัวแปรชื่อ circle โดยการเรียกใช้ function ชื่อ create_circle()
  5. ax.add_pacth(circle)  patch ในที่นี้หมายถึงพื้นที่สี่เหลี่ยมเพื่อใช้ในการวาด การใช้ add_patch() จึงเป็นบอกให้ทราบถึงพื้นที่ที่จะใช้วาดและนำมาแสดง ซึ่งตำแหน่งที่แสดงจะต้องอ้างอิงจากแกน (axe) 
  6. ax.axis('off') บอกให้ pyplot ไม่ต้องวาดเส้นแสดงแกน X และ Y ให้เห็นบนหน้าจอ
3. สร้างวงกลมวงและวาดลงบนพื้นที่

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
Previous
Next Post »