我有一个时间依赖的矩阵,我想把进化画成动画。
我的代码如下:
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但仍然不知道为什么我的代码不能工作。
感谢您的帮助!
最佳答案
你很接近一个有效的解决方案。要么改变
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
关于python - 在matplotlib中对matshow函数进行动画处理,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40039112/