Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

วิธีอัปเดตหัวข้อกราฟแบบ Real-time ด้วย Matplotlib Animation

การอัปเดตหัวข้อกราฟ (Plot Title) แบบไดนามิกขณะเล่น Animation ใน Matplotlib สามารถทำได้โดยใช้ FuncAnimation ร่วมกับการอัปเดต Text Object บน Axes

หลักการทำงาน

  1. สร้าง Figure และ Plot ข้อมูลพื้นฐาน
  2. สร้าง Text Object บน Axes สำหรับแสดง Title (ใช้ ax.text())
  3. สร้างฟังก์ชัน animate(frame) ที่อัปเดตข้อความของ Text Object ทุกเฟรม
  4. ใช้ 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 ได้