2013-08-06 3 views
3

안녕하세요,님께 StackOverfloooow 멤버, matplotlib의 FuncAnimation 모듈을 이해하는 데 문제가 있습니다. 좀 도와 줄래? 나는 두 가지 질문이 있습니다 Python Matplotlib FuncAnimation

  1. 왜 모두 init 죽지 않고 animate 기능 만 다시 PLOT 제공 후 쉼표가 필요?
  2. 내 코드가 time_text을 업데이트하지 않는 이유는 무엇입니까? 모든 애니메이션 후에 t를 출력하도록하면 콘솔에 하나를 추가하지만 텍스트는 플롯에서 업데이트되지 않습니다.

.

import numpy as np 
import matplotlib.pyplot as plt 
from matplotlib import animation 

fig = plt.figure() 
sub = fig.add_subplot(111,xlim=(0, 10), ylim=(0, 1)) 
PLOT, = sub.plot([],[]) 
time_text = sub.text(1,1,"",transform = sub.transAxes, ha="right") 
t = 0 

def init(): 
    PLOT.set_data([],[]) 
    time_text.set_text("") 
    return PLOT,time_text 

def animate(i): 
    global t 
    x = np.linspace(0,10,1000) 
    y = np.exp(- ((x-0.01*i)/(2))**2)/np.sqrt(2*np.pi) 
    t += 1 

    PLOT.set_data(x,y) 
    time_text.set_text("time = "+str(t)) 
    return PLOT, time_text 

ani = animation.FuncAnimation(fig, animate, init_func=init, frames=2000, interval=20, blit=True) 

plt.show() 

답변

3

1) 무슨 뜻인지 잘 모르겠다. initanimate 모두 PLOTtime_text을 반환해야하므로 쉼표로 구분하여 각 함수가 튜플을 반환합니다.

'hanging'쉼표가 PLOT, = sub.plot([],[]) 인 경우 sub.plot은 하나의 요소 인 matplotlib.lines.Line2D 개체가있는 목록을 반환합니다. PLOT,이이 단일 요소 목록의 압축을 풀고 있습니다. 따라서 다음 작업을 수행 할 수도 있습니다.

PLOT = sub.plot([],[])[0] 

요소를 가져 오려면.

2) 코드가 time_text으로 업데이트됩니다. 그래프의 경계 밖으로 그려집니다.

time_text = sub.text(1,1,"",transform = sub.transAxes, ha="right") 

사람 : 예를 변화 들어

time_text = sub.text(1,0,"",transform = sub.transAxes, ha="right") 

는 오른쪽 하단에 표시 얻으려면, 또는 0.5, 0.5는 화면의 중앙에 표시하세요.

+0

그래, 정말 고마워. 쉼표에 관하여 : 예를 들어, 시간 표시를 완료하지 않고 새 plotdata 만 반환하면 : 'return PLOT'은 오류가납니다. 하지만 '리턴 플롯'을 돌려 주면 작동합니다. 그게 왜? – throwaway17434

+4

'PLOT '은'PLOT'에있는 것을 풉니 다. 콘솔에서 이것을 시도해보십시오 :'a, = [1]'. 그런 다음 'a'를 인쇄하십시오. –

+0

좋습니다, 도움이됩니다, 감사합니다 :) – throwaway17434

0

파이썬 튜플은 괄호와 쉼표를 사용하여 작성됩니다. (3,2) 2-tuple입니다. 하나의 튜플은 길이가 1 인 (2,)입니다. 이것은 길이가 전혀 정의되지 않은 int 2와 구별됩니다. 참고 :()는 빈 내용이 포함 된 0- 튜플입니다.

이 경우 함수는 길이가 1 인 열거 형을 반환하므로 쉼표를 생략하면 은 PLOT을 열거 가능하게 만듭니다. 쉼표 기호 을 사용하면 튜플 PLOT의 내용이 반환 값의 내용과 일치합니다.

괄호는 생략 할 수 있으므로 PLOT은 (PLOT,)와 같습니다.

0

다른 답변은 첫 번째 질문에 완전히 대답하지 않습니다.

blit=True을 사용하는 경우에만 initanimate의 반환 명령문이 엄격하게 필요합니다. 이러한 함수는 애니메이션을 업데이트하기 위해 반복 가능한 아티스트를 반환해야합니다.하나의 아티스트가 업데이트되어야하는 경우 두 예술가를 갖는 반환이

return artist1, artist2 
# or 
return [artist1, artist2] 

처럼 보일 수있다, 하나는 여전히 반복 가능한이 필요하다는 것을 기억해야한다. 그 단일 아티스트 다음에 쉼표를 사용하면 함수를 반복 가능하게 만드는 가장 쉬운 방법입니다.

return artist1, 
# or 
return [artist1]