我有一个时间依赖的矩阵,我想将进化绘制为动画。
我的代码如下:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
n_frames = 3 #Numero de ficheros que hemos generado
data = np.empty(n_frames, dtype=object) #Almacena los datos
#Leer todos los datos
for k in range(n_frames):
data[k] = np.loadtxt("frame"+str(k))
fig = plt.figure()
plot =plt.matshow(data[0])
def init():
plot.set_data(data[0])
return plot
def update(j):
plot.set_data(data[j])
return [plot]
anim = FuncAnimation(fig, update, init_func = init, frames=n_frames, interval = 30, blit=True)
plt.show()
但是,当我运行它时,我总是会收到以下错误:draw_artist can only be used after an initial draw which caches the render
。我不知道这个错误来自哪里,也不知道如何解决它。
我已阅读this answer和this article,但仍不知道为什么我的代码无效。
感谢任何帮助,谢谢!
答案 0 :(得分:2)
你非常接近一个有效的解决方案。要么改变
plot = plt.matshow(data[0])
到
plot = plt.matshow(data[0], fignum=0)
或使用
plot = plt.imshow(data[0])
代替。
此处使用plt.matshow(data[0])
的问题是,如果fignum
参数保留为空(即默认等于None
),则为creates a new figure。
由于fig = plt.figure()
被调用且fig
传递给FuncAnimation
,因此您最终得到两个数字,一个数字为plt.matshow
,另一个为空白数字按FuncAnimation
。 FuncAnimation
正在绘制的图形找不到初始绘图,因此它会引发
AttributeError: draw_artist can only be used after an initial draw which caches the render