Matplotlib鼓舞多位艺术家

时间:2018-10-19 20:56:58

标签: python python-3.x matplotlib

我正在尝试创建一个使用blitting的动画Matplotlib图表。我想在同一子图中包括散点图,折线图和注释。但是,我发现的所有示例(例如https://matplotlib.org/gallery/animation/bayes_update.html)似乎只返回单个艺术家,例如只是一个线条图。 (我认为我正确使用了艺术家一词,但可能没有。)

我试图将多位艺术家包装在一起,但这似乎行不通。例如,在下面的示例中,绘图线不会更新,并且如果blit设置为True,则会出现AttributeError:“艺术家”对象没有属性“ set_animated”

from collections import namedtuple

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

fig, ax = plt.subplots()


Artists = namedtuple('Artists', ('scatter', 'plot'))

artists = Artists(
  ax.scatter([], []),
  ax.plot([], [], animated=True)[0],
  )


def init():
    ax.set_xlim(-1, 1)
    ax.set_ylim(-1, 1)
    return artists,


def update(frame):
    artists.scatter.set_offsets([[0, 0]])
    artists.plot.set_data([0, 1], [0, 1])
    return artists,

ani = FuncAnimation(
  fig=fig,
  func=update,
  init_func=init,
  blit=True)

plt.show()

与多位艺术家进行斗殴的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

FuncAnimation文档说

  

func:可调用   在每一帧调用的函数。第一个参数是帧中的下一个值。可以通过fargs参数提供任何其他位置参数。

     

所需的签名是:

   def func(frame, *fargs) -> iterable_of_artists:

因此,返回类型应为列表,元组或通常为Artists的可迭代值。

使用return artists,时,您将返回艺术家的可迭代项目。

因此您可以删除逗号

return artists

更一般的说,命名元组似乎比这里所带来的困惑还要多,所以为什么不简单地返回一个元组呢?

import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

fig, ax = plt.subplots()

scatter = ax.scatter([], [])
plot = ax.plot([], [], animated=True)[0]

def init():
    ax.set_xlim(-1, 1)
    ax.set_ylim(-1, 1)
    return scatter, plot


def update(frame):
    scatter.set_offsets([[0, 0]])
    plot.set_data([0, 1], [0, 1])
    return scatter, plot

ani = FuncAnimation(
        fig=fig,
        func=update,
        init_func=init,
        blit=True)

plt.show()