การอัปเดตหัวข้อกราฟ (Plot Title) แบบไดนามิกขณะเล่น Animation ใน Matplotlib สามารถทำได้โดยใช้ FuncAnimation ร่วมกับการอัปเดต Text Object บน Axes
หลักการทำงาน
- สร้าง Figure และ Plot ข้อมูลพื้นฐาน
- สร้าง Text Object บน Axes สำหรับแสดง Title (ใช้
ax.text()) - สร้างฟังก์ชัน
animate(frame)ที่อัปเดตข้อความของ Text Object ทุกเฟรม - ใช้
FuncAnimationเรียกฟังก์ชัน animate ซ้ำๆ
ตัวอย่างโค้ด
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import animation
# ตั้งค่า Figure
plt.rcParams["figure.figsize"] = [10, 6]
plt.rcParams["figure.autolayout"] = True
fig, ax = plt.subplots()
# สร้างข้อมูล
x = np.linspace(-10, 10, 1000)
y = np.sin(x)
# วาดกราฟพื้นฐาน
line, = ax.plot(x, y, 'b-', linewidth=2, label='y = sin(x)')
ax.set_xlim(-10, 10)
ax.set_ylim(-1.5, 1.5)
ax.grid(True, alpha=0.3)
ax.legend()
# สร้าง Text Object สำหรับ Title ไดนามิก (วางเหนือกราฟ)
title_text = ax.text(0.5, 1.05, "y = sin(x), Frame: 0",
transform=ax.transAxes, # ใช้พิกัด Axes (0-1)
ha="center", va="bottom",
fontsize=14, fontweight="bold",
bbox=dict(facecolor='lightblue', alpha=0.7, pad=5, boxstyle='round'))
# ฟังก์ชัน Animation
def animate(frame):
# อัปเดตข้อความ Title
title_text.set_text(f"y = sin(x), Frame: {frame}")
# ตัวอย่างเพิ่ม: เปลี่ยนสีกราฟตามเฟรม (Optional)
# line.set_color(plt.cm.hsv(frame / 50))
return title_text, # คืนค่า Artist ที่เปลี่ยนแปลง (สำคัญสำหรับ blit=True)
# สร้าง Animation
ani = animation.FuncAnimation(
fig, animate,
frames=100, # จำนวนเฟรม
interval=100, # มิลลิวินาทีต่อเฟรม (10 FPS)
blit=True, # เรนเดอร์เฉพาะส่วนที่เปลี่ยน (เร็วกว่า)
repeat=True
)
plt.show()
ผลลัพธ์
กราฟ Sin Wave พร้อม Title ที่อัปเดตหมายเลข Frame แบบ Real-time ทุก 100 มิลลิวินาที
เทคนิคสำคัญ
- transform=ax.transAxes: ใช้พิกัดสัมพัทธ์กับ Axes (0-1) แทน Data Coordinates ทำให้ Title อยู่ตำแหน่งคงที่
- blit=True: ทำให้ Animation เรียบง่ายกว่าโดยอัปเดตเฉพาะ Artist ที่เปลี่ยนแปลง (ต้อง return tuple ของ Artist)
- ax.text() คืนค่า Text Object ที่สามารถ
set_text()ได้ทุกเมื่อ - ใช้
bboxเพื่อเพิ่มพื้นหลังข้อความ อ่านง่ายขึ้น
การประยุกต์ใช้
สามารถนำไปประยุกต์แสดงค่า Statistics แบบ Real-time เช่น ค่า Mean, Max, Min ของข้อมูลที่ Streaming เข้ามา หรือแสดงสถานะการ Train Model ได้