在Jupyter Notebook中使用Matplotlib对3D矩阵进行动画处理

时间:2018-10-03 15:15:23

标签: python matplotlib jupyter-notebook

我有一个形状为(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([])行有关

任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:1)

几个问题:

  1. 您缺少很多进口商品。
  2. numpy.random.random将元组作为输入,而不是3个参数
  3. imshow需要一个数组作为输入,而不是一个空列表。
  4. imshow返回一个AxesImage,无法解包。因此,该作业上没有,
  5. .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())