2016-11-01 2 views
1

matplotlib에 애니메이션 루프가 있으며 애니메이션의 마지막 반복을 고정하고 싶습니다. 나는 조건과 함께 pause 함수를 사용하여 마지막 반복을 확인합니다. 그러나 마지막 반복에서는 이전 프레임이 표시되며 마지막 프레임은 표시되지 않습니다.Matplotlib 일시 중지, 마지막 반복 수행

import numpy as np 
import matplotlib.pyplot as plt 

fig,ax = plt.subplots(1,1) 
x = np.linspace(0, 6.28, 401) 

freqs = np.arange(5) 

for f in freqs: 
    print f 

    ax.plot(x, np.sin(f*x)) 
    ax.set_title('$\sin(%d x)$'%f) 

    if f < freqs[-1]: 
     plt.pause(1) 
     ax.cla() 
    else: 
     print "hi" 
     plt.show() # Fails: shows frame with `f==3`. 

이 인쇄 :

0 
1 
2 
3 
4 
hi 

하지만, ( f==4)와 최종 프레임은 도시하지 여기

는 일례이다. 애니메이션은 제목이 "sin (3x)"이고 해당 플롯 데이터가 f==3이 아닌 4로 고정됩니다.

마지막 프레임을 유지하는 적절한 방법이 있습니까? 예를 들어 plt.pause(10000)은 작동하지만 해킹처럼 보입니다.

+0

'print (freqs [-1]) '의 결과는 4입니다. 따라서'f DavidG

+0

'f

+0

네 말이 맞아. 그래서 내 시스템에서'plt.shause()'바로 전에'else :'문에'plt.pause (0.01)'를 추가하면 f == 4 프레임을 유지한다. . – DavidG

답변

1

항상 음모를 설정하고 그려서 애니메이션을 시작하는 것이 훨씬 더 직관적입니다.

import numpy as np 
import matplotlib.pyplot as plt 

fig,ax = plt.subplots(1,1) 
x = np.linspace(0, 6.28, 401) 
freqs = np.arange(5) 
line, = ax.plot([],[]) 
ax.set_xlim([x[0], x[-1]]) 
ax.set_ylim([-1, 1]) 
ax.set_title('$\sin(x)$') 
fig.canvas.draw() 

for f in freqs: 
    print f 

    line.set_data(x, np.sin(f*x)) 
    ax.set_title('$\sin(%d x)$'%f) 
    fig.canvas.draw() 

    if f < freqs[-1]: 
     plt.pause(1) 
    else: 
     print "hi" 
plt.show() 
+0

니스. 이것은 각 반복에서 축을 지우는 것보다 더 효율적이라고 가정합니다. –

관련 문제