Анимируйте трехмерную матрицу с помощью Matplotlib в Jupyter Notebook - PullRequest
0 голосов
/ 03 октября 2018

У меня есть 3D-матрица формы (100,50,50), например,

import numpy as np
data = np.random.random(100,50,50)

И я хочу создать анимацию, которая показывает каждый из 2D-срезов размером (50,50) в видетепловая карта или imshow

например:

import matplotlib.pyplot as plt

plt.imshow(data[0,:,:])
plt.show()

будет отображать 1-й кадр этой анимации.Я хотел бы также иметь этот дисплей в ноутбуке Jupyter.В настоящее время я следую этому учебнику для встроенной анимации ноутбука, отображаемой в виде html-видео, но я не могу понять, как заменить данные 1D-строки на фрагмент моего 2D-массива.

Я знаю, что мне нужно создать элемент сюжета, функцию инициализации и функцию анимации.Следуя этому примеру, я попытался:

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 голосов
/ 03 октября 2018

Несколько проблем:

  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())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...