提高matplotlib中重绘轮廓图的速度

时间:2017-02-22 08:35:09

标签: python matplotlib plot contour

我有一个python程序,它将文件中的数据绘制为该文本文件中每行的等高线图。目前,我的界面中有3个独立的等高线图。如果我从文件中读取数据或者在执行脚本之前将其加载到内存中并不重要,我只能从等高线图中获得~6fps。

我也试过只使用一个轮廓和其余的正常情节,但速度只增加到7fps。我不相信用几行来计算它是如此的计算。有没有办法让它快得多?理想情况下,获得至少30fps会很不错。

我绘制轮廓的方式是,对于每行数据,我删除前一行:

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

并添加一个新的

my_contour[0] = ax[0].contour(x, y, my_func, [0])

在代码的开头,我有plt.ion()来更新我添加它们的图。

任何帮助都将不胜感激。

由于

1 个答案:

答案 0 :(得分:4)

以下是如何在动画中使用contour绘图的示例。它使用matplotlib.animation.FuncAnimation,可以轻松打开和关闭blitting。 使用blit = True,它在我的机器上以~64 fps运行,没有blitting ~55 fps。请注意,interval当然必须允许快速动画;将其设置为interval=10(毫秒)将允许最多100 fps,但绘制时间将其限制为慢于此速度。

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

请注意,在上面的动画gif中,会显示较慢的帧速率,因为保存图像的过程需要更长的时间。