我正在尝试创建一个使用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()
与多位艺术家进行斗殴的正确方法是什么?
答案 0 :(得分:1)
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()