【问题标题】:Animating a Quadmesh from pcolormesh with matplotlib使用 matplotlib 从 pcolormesh 为 Quadmesh 设置动画
【发布时间】:2014-02-24 14:39:39
【问题描述】:

经过一整天的反复试验,我将我的发现发布为对可能遇到此问题的其他人的帮助。

在过去的几天里,我一直在尝试模拟来自 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

虽然这在技术上有效,但它也禁用了缩放功能,以及平移,以及一切!

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

【问题讨论】:

  • 恭喜一切顺利!提出问题并在stackoverflow上发布您自己的答案是非常好的(并且鼓励)。但是,最好将问题和答案分开。现在,你把它们放在一起。如果有机会,请发布问题的后半部分作为答案。一天左右后,您也可以将其标记为已接受的答案。顺便说一句,很好的问题和很好的答案!
  • 另外,请注意,imshow(与interp='none' 匹配pcolormesh)将是动画的更好选择。它的渲染速度要快得多,尤其是对于大型数据集。此外,如果您更改动画以更新现有对象而不是在旧对象之上添加新对象,您将获得更好的性能(您当前的方法可能每帧都会变慢)。无论如何,如果您在访问“实时”数据流后需要更好的性能,只是建议。

标签: python animation matplotlib


【解决方案1】:

所以我开始研究 matplotlib 动画 API,希望能找到解决方案。动画确实正是我想要的,尽管它在切片中与 QuadMesh 对象的使用没有完全记录。这是我最终想出的:

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!否则它会因为 QuadMesh 对象不是“可迭代”而对你大喊大叫。

我还没有访问雷达的权限,所以我无法针对实时数据流进行测试,但对于静态文件,到目前为止它运行良好。在绘制数据时,我可以使用动画进行缩放和平移。

祝你有自己的动画/绘图野心!

【讨论】:

  • blit=True 正在寻找要更新的对象列表。如果您为 pcolormesh 对象分配句柄,例如pcm = plt.pcolormesh(X[0:1], Y[0:1], C[0:1]) 然后你可以用pcm.set_array(new_cdata) 更新pcm 的数据。 animate 函数需要返回一个要更新的对象的可迭代对象,所以你需要在animate 函数的末尾添加return pcm,。请注意逗号,它告诉函数将 pcm 作为 1 元素元组的元素返回。
猜你喜欢
  • 2018-08-10
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-24
  • 2022-10-25
  • 2014-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多