我有一个形状为(100,50,50)的3D矩阵,例如
import numpy as np
data = np.random.random(100,50,50)
我想创建一个动画,以热图或imshow
的形式显示大小为(50,50)的每个2D切片
例如:
import matplotlib.pyplot as plt
plt.imshow(data[0,:,:])
plt.show()
将显示此动画的第一个“帧”。我也想在Jupyter笔记本电脑中显示此显示器。我目前正在按照this教程将内联笔记本动画显示为html视频,但我不知道如何用我的2D数组的一部分替换1D线数据。
我知道我需要创建一个plot元素,一个初始化函数和一个动画函数。在该示例之后,我尝试了:
fig, ax = plt.subplots()
ax.set_xlim((0, 50))
ax.set_ylim((0, 50))
im, = ax.imshow([])
def init():
im.set_data([])
return (im,)
# animation function. This is called sequentially
def animate(i):
data_slice = data[i,:,:]
im.set_data(i)
return (im,)
# call the animator. blit=True means only re-draw the parts that have changed.
anim = animation.FuncAnimation(fig, animate, init_func=init,
frames=100, interval=20, blit=True)
HTML(anim.to_html5_video())
但是我尝试尝试时都会遇到各种错误,这些错误大多与im, = ax.imshow([])
行有关
任何帮助表示赞赏!
答案 0 :(得分:1)
几个问题:
numpy.random.random
将元组作为输入,而不是3个参数imshow
需要一个数组作为输入,而不是一个空列表。imshow
返回一个AxesImage
,无法解包。因此,该作业上没有,
。.set_data()
需要数据,而不是输入的帧号。完整代码:
from IPython.display import HTML
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
data = np.random.rand(100,50,50)
fig, ax = plt.subplots()
ax.set_xlim((0, 50))
ax.set_ylim((0, 50))
im = ax.imshow(data[0,:,:])
def init():
im.set_data(data[0,:,:])
return (im,)
# animation function. This is called sequentially
def animate(i):
data_slice = data[i,:,:]
im.set_data(data_slice)
return (im,)
# call the animator. blit=True means only re-draw the parts that have changed.
anim = animation.FuncAnimation(fig, animate, init_func=init,
frames=100, interval=20, blit=True)
HTML(anim.to_html5_video())