먼저 (성능에 전혀 영향을주지 않지만) 다음과 같이 코드를 정리하는 것이 좋습니다.
import matplotlib.pyplot as plt
import numpy as np
import time
x = np.arange(0, 2*np.pi, 0.01)
y = np.sin(x)
fig, axes = plt.subplots(nrows=6)
styles = ['r-', 'g-', 'y-', 'm-', 'k-', 'c-']
lines = [ax.plot(x, y, style)[0] for ax, style in zip(axes, styles)]
fig.show()
tstart = time.time()
for i in xrange(1, 20):
for j, line in enumerate(lines, start=1):
line.set_ydata(np.sin(j*x + i/10.0))
fig.canvas.draw()
print 'FPS:' , 20/(time.time()-tstart)
위의 예에서는 약 10fps를 얻습니다.
정확한 사용 사례에 따라 matplotlib는 좋은 선택이 아닐 수 있습니다. 실시간 디스플레이가 아닌 출판 품질의 수치를 지향합니다.
그러나이 예제의 속도를 높이기 위해 수행 할 수있는 작업이 많이 있습니다.
이것이 느린 이유는 크게 두 가지입니다.
1) 호출하면 모든 것이fig.canvas.draw()
다시 그려 집니다. 병목 현상입니다. 귀하의 경우 축 경계, 눈금 레이블 등과 같은 것을 다시 그릴 필요가 없습니다.
2) 귀하의 경우에는 눈금 레이블이 많은 서브 플롯이 많이 있습니다. 그리는 데 시간이 오래 걸립니다.
둘 다 블리 팅을 사용하여 수정할 수 있습니다.
블리 팅을 효율적으로 수행하려면 백엔드 별 코드를 사용해야합니다. 실제로 부드러운 애니메이션에 대해 정말로 걱정한다면, 어쨌든 일종의 GUI 툴킷에 matplotlib 플롯을 포함 시키므로 이는 큰 문제가 아닙니다.
그러나 당신이하는 일에 대해 조금 더 알지 못하면 나는 당신을 도울 수 없습니다.
그럼에도 불구하고 여전히 상당히 빠른 GUI 중립적 인 방법이 있습니다.
import matplotlib.pyplot as plt
import numpy as np
import time
x = np.arange(0, 2*np.pi, 0.1)
y = np.sin(x)
fig, axes = plt.subplots(nrows=6)
fig.show()
# We need to draw the canvas before we start animating...
fig.canvas.draw()
styles = ['r-', 'g-', 'y-', 'm-', 'k-', 'c-']
def plot(ax, style):
return ax.plot(x, y, style, animated=True)[0]
lines = [plot(ax, style) for ax, style in zip(axes, styles)]
# Let's capture the background of the figure
backgrounds = [fig.canvas.copy_from_bbox(ax.bbox) for ax in axes]
tstart = time.time()
for i in xrange(1, 2000):
items = enumerate(zip(lines, axes, backgrounds), start=1)
for j, (line, ax, background) in items:
fig.canvas.restore_region(background)
line.set_ydata(np.sin(j*x + i/10.0))
ax.draw_artist(line)
fig.canvas.blit(ax.bbox)
print 'FPS:' , 2000/(time.time()-tstart)
이것은 ~ 200fps를 제공합니다.
이것을 좀 더 편리하게 만들기 위해 animations
최신 버전의 matplotlib에 모듈이 있습니다.
예로서:
import matplotlib.pyplot as plt
import matplotlib.animation as animation
import numpy as np
x = np.arange(0, 2*np.pi, 0.1)
y = np.sin(x)
fig, axes = plt.subplots(nrows=6)
styles = ['r-', 'g-', 'y-', 'm-', 'k-', 'c-']
def plot(ax, style):
return ax.plot(x, y, style, animated=True)[0]
lines = [plot(ax, style) for ax, style in zip(axes, styles)]
def animate(i):
for j, line in enumerate(lines, start=1):
line.set_ydata(np.sin(j*x + i/10.0))
return lines
# We'd normally specify a reasonable "interval" here...
ani = animation.FuncAnimation(fig, animate, xrange(1, 200),
interval=0, blit=True)
plt.show()