【问题标题】:Matplotlib Basemap Hexbin Animation: Clear hexbins between framesMatplotlib Basemap Hexbin 动画:清除帧之间的 hexbins
【发布时间】:2018-05-24 16:47:12
【问题描述】:

我正在为底图图像上的 hexbin 热图制作动画,但不知道如何在开始下一帧之前删除之前的 hexes。我想用一些积累来制作动画,但以选定的时间间隔重置(我的数据有一个时间维度,我想每天显示给定年份的所有点,然后擦除十六进制并显示下一年)。我想我需要存储图层,并使用它的 .remove() 方法,但我想不通。

def update_hex(i, prev_layer):
  if i == (len(years) - 1):
    ani.event_source.stop()
    print("End animation: Update Hex")

  x, y = [mm.xmin, mm.xmax], [mm.ymin, mm.ymax]
  x1, y1 = mm(df["LONGITUDE"][df["YEAR"] == years[i]].values, df["LATITUDE"][df["YEAR"] == years[i]].values)
  x += x1.tolist()
  y += y1.tolist()
  x = np.array(x)
  y = np.array(y)
  if prev_layer:
    prev_layer.remove()

  hexlayer = mm.hexbin(x, y, gridsize = 75, bins = 100, mincnt = 0, cmap = 'my_cmap', linewidth = 0)

prev_layer = None
ani = animation.FuncAnimation(fig, update_hex, interval = 10, frames = range(len(years)), fargs = (prev_layer, ))
plt.show()

【问题讨论】:

    标签: python matplotlib matplotlib-basemap


    【解决方案1】:

    在这种情况下,我会使用一个全局数组来存储hexbin() 返回的对象。在预定义的时间间隔,我会删除这些对象,并清空数组的内容,然后重复。

    fig, ax = plt.subplots()
    
    def animate(i):
        x0,y0 = np.random.random(size=(2,))*4-2
        x = np.random.normal(loc=x0, size=(1000,))
        y = np.random.normal(loc=y0, size=(1000,))
    
        if len(prevlayers)>=maxlayers:
            for layer in prevlayers:
                layer.remove()
            prevlayers[:] = []    
    
        hexlayer = ax.hexbin(x,y, gridsize=10, alpha=0.5)
        prevlayers.append(hexlayer)
        return hexlayer,
    
    maxlayers = 3
    prevlayers = []
    ani = matplotlib.animation.FuncAnimation(fig, animate, frames=12)
    

    【讨论】:

    • 我尝试在 maxlayers = 1 的情况下使用此解决方案,但出现错误 ValueError: list.remove(x): x not in list。有没有更好的方法来一次只显示一个图层?
    猜你喜欢
    • 2017-10-03
    • 2017-03-26
    • 2016-12-16
    • 1970-01-01
    • 2018-11-30
    • 2012-02-08
    • 2012-11-16
    • 1970-01-01
    • 2014-01-08
    相关资源
    最近更新 更多