Python matplotlib 이용해서 실시간으로 차트 갱신할 수 있는 방법에 대해 공유할게요!
실시간으로 변화하는 센서 값이나, 소켓 통신 등을 통해 주기적으로 갱신되는 데이터를 디버깅하기 위해 실시간으로 데이터를 가시화 해야 하는 경우가 종종 있습니다. 매번 까먹고 또 찾고.. 또 찾고 하다 보니 정리해 두면 좋을 것 같아요!
플롯을 실시간으로 업데이트하는 방식은 여러 가지가 있는데요, 그 원리를 이해하시면 모두 비슷하거나 동일한 방식이라는 것을 이해하실 수 있어요! 바로 예제를 살펴보겠습니다!
예제 1. plt.ion()
import matplotlib.pyplot as plt
import numpy as np
#Dataset
x, y = [],[]
#Switch to interactive mode
plt.ion()
fig, ax = plt.subplots()
scat = ax.scatter(x,y)
plt.xlim(0,100)
plt.ylim(0,100)
plt.draw()
for i in range(1000):
#Set data ex) Socket receive or other computations
x.append(np.random.rand(1)*100)
y.append(np.random.rand(1)*100)
#To 2D array & set data
scat.set_offsets(np.c_[x,y])
#Draw
fig.canvas.draw_idle()
plt.pause(0.1)
위 예제는 plt.ion() 함수를 통해 plt를 대화형 모드로 전환해 줍니다. 일반적인 사용 예제와 큰 차이는 없으며 새로운 데이터 설정 시 set_offsets(2D array)를 통해 데이터를 업데이트해 주고, draw() 함수를 통해 figure를 새로운 데이터로 업데이트해 줍니다.
Line을 사용하는 예제는 이미 많아서 예제 1에서는 scatter를 사용하였습니다. line plot을 사용하는 예제에서는 데이터 업데이트 시 line.set_xdata(), line.set_ydata()를 사용하시면 됩니다!

다음으로는 가장 흔하게 사용되는 FuncAnimation을 이용한 방법을 살펴볼게요. FuncAnimation은 미리 프레임 수와 주기를 설한 후에 프레임 업데이트 시 콜백 호출을 통해 데이터를 업데이트 하는 방식이에요!
예제 2 FuncAnimation 활용
import matplotlib.pyplot as plt
import matplotlib.animation
import numpy as np
x, y = [],[]
fig, ax = plt.subplots()
scat = ax.scatter(x,y)
plt.xlim(0,10)
plt.ylim(0,10)
def update(i):
x.append(np.random.rand(1)*10)
y.append(np.random.rand(1)*10)
scat.set_offsets(np.c_[x,y])
ani = matplotlib.animation.FuncAnimation(fig, update,
frames=2, interval=100, repeat=True)
plt.show()
두 번째 예제에서는 FuncAnimation을 사용하여 update() 호출을 통해 figure가 업데이트 되고 있습니다!
FuncAnimation을 간단하게 살펴보면 Frames는 명시적으로 프레임 수를 정하고(동영상 저장 시에 거시적으로 활용됨), 현재 프레임 정보를 업데이트 메서드에 전달하는 목적으로 사용됩니다. update()에 매개변수로 프레임 업데이트 시마다 현재 프레임값을 받을 수 있습니다! (위 예제에서 i)
interval은 업데이트 주기를 결정하는 ms단위의 값이고, repeat은 말 그대로 반복 여부입니다!
FuncAnimation은 본 게시글에서 소개하는 것보다 다양한 기능을 가지고 있으니, 필요하신 분들은 아래 링크를 참고하시기 바랍니다
matplotlib.animation.FuncAnimation — Matplotlib 3.7.2 documentation
감사합니다~!
#matplotlib#실시간#업데이트