2015-01-21 5 views
10

커지는 라인의 플롯에 애니메이션을 적용하는 데 사용할 수있는 프레임 세트를 생성하려고합니다. 과거에는 plt.draw() 및 set_ydata()를 사용하여 시간이 지남에 따라 변경된 y- 데이터를 다시 그렸습니다. 이번에는 시간이지나면서 그래프를 가로 질러 움직이는 "성장하는"선을 그리기를 원합니다. 이 때문에 set_ydata가 작동하지 않습니다 (xdata의 길이가 변경됨). 예 :Python/Matplotlib에서 "성장하는"선 그림 플롯

import numpy as np 
import matplotlib.pyplot as plt 

x = np.linspace(0, 10, 100) 
y = np.sin(x) 

plt.figure() 
for n in range(len(x)): 
    plt.plot(x[:n], y[:n], color='k') 
    plt.axis([0, 10, 0, 1]) 
    plt.savefig('Frame%03d.png' %n) 

이 방법은 효과가 있지만 느려집니다. 이 작업을 수행하는 더 빠른 방법이 있습니까?

+0

다시 만들려고하는 그래픽의 샘플 (링크)이 있습니까? 파이썬에는 사용할 수있는 애니메이션 패키지가 많이 있습니다. –

+0

@MylesBaker 다음은 위 코드의 예입니다. http://media.giphy.com/media/3xz2BD48KS3fOGzAJ2/giphy.gif – Blink

+0

데이터가 많을수록 그래프 한도를 업데이트 하시겠습니까? 드러난? (즉, 그래프 다시 그리기)? 또는 도메인 및 범위를 알고 있습니까? –

답변

19

노트의 몇 :

우선 상황이 될 이유가 점진적으로 느린 같은 위치에 점점 더 많은 중복 선을 그릴하고 있다는 점이다. 그러나, 더 나은 아직

import numpy as np 
import matplotlib.pyplot as plt 

x = np.linspace(0, 10, 100) 
y = np.sin(x) 

plt.figure() 
for n in range(len(x)): 
    plt.cla() 
    plt.plot(x[:n], y[:n], color='k') 
    plt.axis([0, 10, 0, 1]) 
    plt.savefig('Frame%03d.png' %n) 

동시에 x와 y 데이터를 모두 업데이트 :

import numpy as np 
import matplotlib.pyplot as plt 

x = np.linspace(0, 10, 100) 
y = np.sin(x) 

fig, ax = plt.subplots() 
line, = ax.plot(x, y, color='k') 

for n in range(len(x)): 
    line.set_data(x[:n], y[:n]) 
    ax.axis([0, 10, 0, 1]) 
    fig.canvas.draw() 
    fig.savefig('Frame%03d.png' %n) 

그리고 만약 '

빠른 수정 플롯 각 시간을 취소하는 것입니다 애니메이션 모듈을 사용하고 싶습니다. (참고 : blit=True은 일부 백엔드 (예 : OSX)에서 제대로 작동하지 않을 수 있으므로 문제가있는 경우 blit=False을 시도하십시오.) :

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

x = np.linspace(0, 10, 100) 
y = np.sin(x) 

fig, ax = plt.subplots() 
line, = ax.plot(x, y, color='k') 

def update(num, x, y, line): 
    line.set_data(x[:num], y[:num]) 
    line.axes.axis([0, 10, 0, 1]) 
    return line, 

ani = animation.FuncAnimation(fig, update, len(x), fargs=[x, y, line], 
           interval=25, blit=True) 
ani.save('test.gif') 
plt.show() 

enter image description here

+1

'set_data' 솔루션은 매우 우아합니다. 내가 10 번 upvote 할 수 있으면 좋겠다. –