2017-11-22 4 views
1

나는 애니메이션이 실행 중이거나 정지 상태 일 때 애니메이션 플롯의 xlim과 ylim을 변경할 수 있기를 원합니다. 애니메이션이 실행되는 동안 (ax.set_xlim/set_ylim 호출을 사용하여) 변경하면 문제가 없지만 event_source.stop()을 사용하여 애니메이션을 일시 중지하면 좌표 축을 따라 그려지는 숫자는 변경되지 않습니다.matplotlib에서 일시 정지 된 애니메이션의 좌표 범위를 조정하는 방법은 무엇입니까?

다음은이 문제를 보여주는 테스트 프로그램입니다. 애니메이션이 실행되는 동안 '-'와 '+'키를 눌러보십시오. 파란색 오브젝트가 스케일되고 좌표 범위가 업데이트됨을 볼 수 있습니다. 그러나 SPACE를 먼저 눌러 애니메이션을 일시 중지 한 다음 '-'또는 '+'를 누르면 파란색 오브젝트 만 크기가 조정되지만 좌표 범위는 그대로 유지됩니다 (애니메이션은 호출의 부작용으로 다시 시작됩니다). ani._end_redraw (없음)).

import matplotlib.pyplot as plt 
import matplotlib.animation as animation 
from numpy import sin, cos, pi 

def keypress(event): 
    global anim_running 
    if event.key == ' ': 
     ani.event_source.stop() if anim_running else ani.event_source.start() 
     anim_running = not anim_running 
    elif event.key == '+': 
     ax.set_xlim([-4,4]) 
     ax.set_ylim([-4,4]) 
     ani._end_redraw(None) 
    elif event.key == '-': 
     ax.set_xlim([-1,1]) 
     ax.set_ylim([-1,1]) 
     ani._handle_resize() 
     ani._end_redraw(None) 

phi = pi/2 

def animate(i): 
    global phi 
    line.set_data([[0.0, sin(phi)], [0.0, cos(phi)]]) 
    phi += 0.01 
    return line, 

fig,ax = plt.subplots(1, 1) 
ax.set_xlim([-2,2]) 
ax.set_ylim([-2,2]) 
line, = ax.plot([], [], 'o-', lw=2, color='b') 
fig.canvas.mpl_connect('key_press_event', keypress) 
ani = animation.FuncAnimation(fig, animate, blit=True, interval=0, frames=2000) 
anim_running = True 
plt.show() 
+0

가 다시이 아니라, 1. 변경 제한 2. 그리기 캔버스, 3.stop 애니메이션 일 (_end_redraw를 통해), (_handle_resize 통해) 4. 다시 시작 애니메이션을 새로운 배경을 잡아 것 같아요 블리 팅에 문제가있다. 그래서 그 요구 사항은 질문의 일부가되어야합니다. – ImportanceOfBeingErnest

답변

1

관찰 할 수있는 한계가 변경되도록 전체 캔버스를 다시 그려야합니다. 나는 좋은 전략이

import matplotlib.pyplot as plt 
import matplotlib.animation as animation 
from numpy import sin, cos, pi 

def keypress(event): 
    global anim_running 
    if event.key == ' ': 
     ani.event_source.stop() if anim_running else ani.event_source.start() 
     anim_running = not anim_running 
    elif event.key == '+': 
     ax.set_xlim([-4,4]) 
     ax.set_ylim([-4,4]) 
     fig.canvas.draw() 
     ani._handle_resize() 
     ani._end_redraw(None) 
    elif event.key == '-': 
     ax.set_xlim([-1,1]) 
     ax.set_ylim([-1,1]) 
     fig.canvas.draw() 
     ani._handle_resize() 
     ani._end_redraw(None) 

phi = pi/2 

def animate(i): 
    global phi 
    line.set_data([[0.0, sin(phi)], [0.0, cos(phi)]]) 
    phi += 0.01 
    return line, 

fig,ax = plt.subplots(1, 1) 
ax.set_xlim([-2,2]) 
ax.set_ylim([-2,2]) 
line, = ax.plot([], [], 'o-', lw=2, color='b') 
fig.canvas.mpl_connect('key_press_event', keypress) 
ani = animation.FuncAnimation(fig, animate, blit=True, interval=2, frames=2000) 
anim_running = True 
plt.show() 
+0

고맙습니다. 예, 작동합니다! 다시 너는 나를 도왔다. 나는 언젠가 당신의 친절로 당신을 갚을 수 있기를 바랍니다. :) –