다음은 애니메이션에 contour
플롯을 사용하는 방법에 대한 예입니다. 블리 팅을 쉽게 켜거나 끌 수있는 matplotlib.animation.FuncAnimation
을 사용합니다. blit = True로 설정하면 ~ 55fps를 블리핑하지 않고 내 컴퓨터에서 ~ 64fps로 실행됩니다. 물론 interval
은 빠른 애니메이션을 허용해야합니다. interval=10
(밀리 초)으로 설정하면 최대 100fps가 허용되지만 그리기 시간은 이보다 느린 속도로 제한됩니다. 이미지를 저장하는 과정이 좀 더 걸리기 때문에, 더 느린 프레임 속도를 상기 애니메이션 GIF에 도시되어
는
import matplotlib.pyplot as plt
import matplotlib.animation
import numpy as np
import time
x= np.linspace(0,3*np.pi)
X,Y = np.meshgrid(x,x)
f = lambda x,y, alpha, beta :(np.sin(X+alpha)+np.sin(Y*(1+np.sin(beta)*.4)+alpha))**2
alpha=np.linspace(0, 2*np.pi, num=34)
levels= 10
cmap=plt.cm.magma
fig, ax=plt.subplots()
props = dict(boxstyle='round', facecolor='wheat')
timelabel = ax.text(0.9,0.9, "", transform=ax.transAxes, ha="right", bbox=props)
t = np.ones(10)*time.time()
p = [ax.contour(X,Y,f(X,Y,0,0), levels, cmap=cmap) ]
def update(i):
for tp in p[0].collections:
tp.remove()
p[0] = ax.contour(X,Y,f(X,Y,alpha[i],alpha[i]), levels, cmap= cmap)
t[1:] = t[0:-1]
t[0] = time.time()
timelabel.set_text("{:.3f} fps".format(-1./np.diff(t).mean()))
return p[0].collections+[timelabel]
ani = matplotlib.animation.FuncAnimation(fig, update, frames=len(alpha),
interval=10, blit=True, repeat=True)
plt.show()
참고.
플롯을 업데이트 할 수있는 속도는 (a) 새 데이터를 계산하는 데 걸린 시간과 (b) 축을 그리는 데 걸리는 시간의 두 가지에 달려 있습니다. 일반적으로 귀하의 경우 어느 쪽이 더 많은 시간이 소요되는지 말하기는 어렵습니다. 불행하게도, 'contour'는 모든 반복에서 데이터를 다시 계산해야하므로 거의 이득이 없습니다. 그리기 시간은 블리 팅 (blitting)을 사용하여 잠재적으로 줄일 수 있지만이 방법으로 7에서 30fps로 이동하게됩니다. – ImportanceOfBeingErnest
음, 윤곽을 더 추가해도 fps가 크게 감소하지 않습니다. 이제 6 개의 윤곽선을 시도하고 5.5-6.5 fps를 얻습니다. 7-7.5fps를 얻으면 영원히 움직이는 플롯을 업데이트 할 때 matplotlib에서 어떤 일이 일어납니다. 또한 윤곽 플롯의 메시 밀도를 줄이면 프레임 속도가 fps의 일부분 만 증가합니다. – UN4
[blitting] (http://stackoverflow.com/questions/40126176/fast-live-plotting-in-matplotlib-pyplot)과 같은 말은 실제로 이점을 제공 할 수 있습니다. – ImportanceOfBeingErnest