2017-02-22 1 views
2

파일의 데이터를 텍스트 파일의 각 행에 대한 등고선 그래프로 표시하는 Python 프로그램이 있습니다. 현재 인터페이스에 3 개의 별도 윤곽 플롯이 있습니다. 파일에서 데이터를 읽거나 스크립트를 실행하기 전에 메모리에로드하면 컨투어 플롯에서 ~ 6fps 밖에 얻을 수 없습니다.matplotlib의 등고선 그리기 속도를 높이십시오

나는 하나의 등고선을 사용하고 나머지는 일반 플롯을 사용했지만 속도는 단지 7fps로 증가했습니다. 나는 너무 계산적으로 몇 줄을 그어야한다고 생각하지 않는다. 실질적으로 더 빨리 만들 수있는 방법이 있습니까? 적어도 30fps를 얻는 것이 이상적입니다.

내가 윤곽을 그리는 방법은 내 데이터의 각 행에 대해 내가 이전 제거하는 것이 있습니다 :

for coll in my_contour[0].collections: 
    coll.remove() 

및 코드의 시작 부분에

하나의 새로운
my_contour[0] = ax[0].contour(x, y, my_func, [0]) 

을 추가, 플롯을 추가 할 때 plt.ion()을 업데이트해야합니다.

도움을 주시면 감사하겠습니다.

감사

+0

플롯을 업데이트 할 수있는 속도는 (a) 새 데이터를 계산하는 데 걸린 시간과 (b) 축을 그리는 데 걸리는 시간의 두 가지에 달려 있습니다. 일반적으로 귀하의 경우 어느 쪽이 더 많은 시간이 소요되는지 말하기는 어렵습니다. 불행하게도, 'contour'는 모든 반복에서 데이터를 다시 계산해야하므로 거의 이득이 없습니다. 그리기 시간은 블리 팅 (blitting)을 사용하여 잠재적으로 줄일 수 있지만이 방법으로 7에서 30fps로 이동하게됩니다. – ImportanceOfBeingErnest

+0

음, 윤곽을 더 추가해도 fps가 크게 감소하지 않습니다. 이제 6 개의 윤곽선을 시도하고 5.5-6.5 fps를 얻습니다. 7-7.5fps를 얻으면 영원히 움직이는 플롯을 업데이트 할 때 matplotlib에서 어떤 일이 일어납니다. 또한 윤곽 플롯의 메시 밀도를 줄이면 프레임 속도가 fps의 일부분 만 증가합니다. – UN4

+0

[blitting] (http://stackoverflow.com/questions/40126176/fast-live-plotting-in-matplotlib-pyplot)과 같은 말은 실제로 이점을 제공 할 수 있습니다. – ImportanceOfBeingErnest

답변

2

다음은 애니메이션에 contour 플롯을 사용하는 방법에 대한 예입니다. 블리 팅을 쉽게 켜거나 끌 수있는 matplotlib.animation.FuncAnimation을 사용합니다. blit = True로 설정하면 ~ 55fps를 블리핑하지 않고 내 컴퓨터에서 ~ 64fps로 실행됩니다. 물론 interval은 빠른 애니메이션을 허용해야합니다. interval=10 (밀리 초)으로 설정하면 최대 100fps가 허용되지만 그리기 시간은 이보다 느린 속도로 제한됩니다. 이미지를 저장하는 과정이 좀 더 걸리기 때문에, 더 느린 프레임 속도를 상기 애니메이션 GIF에 도시되어

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

x= np.linspace(0,3*np.pi) 
X,Y = np.meshgrid(x,x) 
f = lambda x,y, alpha, beta :(np.sin(X+alpha)+np.sin(Y*(1+np.sin(beta)*.4)+alpha))**2 
alpha=np.linspace(0, 2*np.pi, num=34) 
levels= 10 
cmap=plt.cm.magma 


fig, ax=plt.subplots() 
props = dict(boxstyle='round', facecolor='wheat') 
timelabel = ax.text(0.9,0.9, "", transform=ax.transAxes, ha="right", bbox=props) 
t = np.ones(10)*time.time() 
p = [ax.contour(X,Y,f(X,Y,0,0), levels, cmap=cmap) ] 

def update(i): 
    for tp in p[0].collections: 
     tp.remove() 
    p[0] = ax.contour(X,Y,f(X,Y,alpha[i],alpha[i]), levels, cmap= cmap) 
    t[1:] = t[0:-1] 
    t[0] = time.time() 
    timelabel.set_text("{:.3f} fps".format(-1./np.diff(t).mean())) 
    return p[0].collections+[timelabel] 

ani = matplotlib.animation.FuncAnimation(fig, update, frames=len(alpha), 
             interval=10, blit=True, repeat=True) 
plt.show() 

enter image description here

참고.

+0

이것은 놀랍습니다. 나의 6 등고선은 모두 50fps로 실행됩니다! 거대한 개선! 감사! – UN4

+0

도움을 많이 주셔서 감사합니다. 이 애니메이션이 얼마나 직관적이지 않은지 불만 스럽다.'QuadContour' 객체에서'set_array'를 사용 하려다가 모든 아티스트를 생성 하려다가'ArtistAnimation'을 사용하지 못했습니다.유일한 대답은 ** ArtistAnimation ** 뒤에 숨어있는 과정을 수행하는 것으로 밝혀졌습니다 ** 그리고 **는이 작업을'FuncAnimation'으로 만듭니다. matplotlib는 정말로 여기서 일해야합니다. –

+0

@ LukeDavis 문제가 무엇인지는 분명하지 않습니다. 4 개의 주석 줄은 너무 명확하여 설명이 명확하지 않으므로 문제에 대해 새로운 질문을 할 수도 있습니다. – ImportanceOfBeingErnest

관련 문제