Python 使用matplotlib从pcolormesh设置四边形网格动画
经过一整天的反复试验,我将我的发现作为对任何可能遇到这个问题的人的帮助 在过去的几天里,我一直在尝试模拟来自netCDF文件的一些雷达数据的实时绘图,以便与我正在为一个学校项目构建的GUI一起工作。我尝试的第一件事是使用matplotlib的“交互模式”简单地重新绘制数据,如下所示: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
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元素元组的元素返回。