Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用matplotlib从pcolormesh设置四边形网格动画_Python_Animation_Matplotlib - Fatal编程技术网

Python 使用matplotlib从pcolormesh设置四边形网格动画

Python 使用matplotlib从pcolormesh设置四边形网格动画,python,animation,matplotlib,Python,Animation,Matplotlib,经过一整天的反复试验,我将我的发现作为对任何可能遇到这个问题的人的帮助 在过去的几天里,我一直在尝试模拟来自netCDF文件的一些雷达数据的实时绘图,以便与我正在为一个学校项目构建的GUI一起工作。我尝试的第一件事是使用matplotlib的“交互模式”简单地重新绘制数据,如下所示: import matplotlib.pylab as plt fig = plt.figure() plt.ion() #Interactive mode on for i in range(2,155): #S

经过一整天的反复试验,我将我的发现作为对任何可能遇到这个问题的人的帮助

在过去的几天里,我一直在尝试模拟来自netCDF文件的一些雷达数据的实时绘图,以便与我正在为一个学校项目构建的GUI一起工作。我尝试的第一件事是使用matplotlib的“交互模式”简单地重新绘制数据,如下所示:

import matplotlib.pylab as plt

fig = plt.figure()
plt.ion() #Interactive mode on
for i in range(2,155): #Set to the number of rows in your quadmesh, start at 2 for overlap
    plt.hold(True)
    print i
    #Please note: To use this example you must compute X, Y, and C previously.
    #Here I take a slice of the data I'm plotting - if this were a real-time
    #plot, you would insert the new data to be plotted here.
    temp = plt.pcolormesh(X[i-2:i], Y[i-2:i], C[i-2:i])
    plt.draw()
    plt.pause(.001) #You must use plt.pause or the figure will freeze

 plt.hold(False)      
 plt.ioff() #Interactive mode off
虽然这在技术上是可行的,但它也会禁用缩放功能,以及平移和所有功能


对于雷达显示图而言,这是不可接受的。请参见下面我的解决方案。

因此我开始研究matplotlib动画API,希望找到解决方案。动画确实是我想要的,尽管它在切片中与四边形对象的使用没有确切的文档记录。这就是我最终想到的:

import matplotlib.pylab as plt
from matplotlib import animation

fig = plt.figure()

plt.hold(True)
#We need to prime the pump, so to speak and create a quadmesh for plt to work with
plt.pcolormesh(X[0:1], Y[0:1], C[0:1])

anim = animation.FuncAnimation(fig, animate, frames = range(2,155), blit = False)

plt.show()
plt.hold(False)

def animate( self, i):
    plt.title('Ray: %.2f'%i)
    #This is where new data is inserted into the plot.
    plt.pcolormesh(X[i-2:i], Y[i-2:i], C[i-2:i])
请注意,blit必须为False!否则,它会对您大喊大叫,说四边形网格对象不可“iterable”

我还没有访问雷达的权限,所以我还无法对实时数据流进行测试,但对于静态文件,它迄今为止工作得非常好。在打印数据时,我可以使用动画进行缩放和平移


祝你自己的动画/绘图野心好运

恭喜你把事情做好了!问一个问题并在stackoverflow上发布自己的答案是非常好的(并受到鼓励)。但是,最好将问题和答案分开。现在,你把它们放在一起了。如果你有机会,把问题的后半部分贴出来作为答案。大约一天后,你也可以将其标记为已接受的答案。顺便说一句,问题和答案都很好!另外,正如您所知,
imshow
(使用
interp='none'
匹配
pcolormesh
)将是动画的更好选择。它的渲染速度相当快,尤其是对于大型数据集。此外,如果更改动画以更新现有对象,而不是在旧对象的基础上添加新对象,则会获得更好的性能(当前方法可能会随着每一帧而变慢)。无论如何,如果您访问了“实时”数据流后需要更好的性能,则只需提供建议。
blit=True
正在查找要更新的对象列表。如果为pcolormesh对象指定句柄,例如
pcm=plt.pcolormesh(X[0:1],Y[0:1],C[0:1])
,则可以使用
pcm更新
pcm
的数据。set\u array(new\u cdata)
动画函数需要返回一组要更新的对象,因此需要添加
return pcm,
动画制作功能的末尾。请注意逗号,它告诉函数将
pcm
作为1元素元组的元素返回。