Почему я не могу добавить несколько проекционных 3D-сюжетов в мою анимацию matplotlib? - PullRequest
0 голосов
/ 08 января 2019

Я не могу добавить вторую ось проекции 3d на мою фигуру. Если я раскомментирую строку ax2, я получаю сообщение об ошибке:

Traceback (последний вызов был последним): File "/Sequoia/data1/gcheron/lib/anaconda2/envs/detectron/lib/python2.7/site-packages/matplotlib/cbook/init.py", линия 388, в процессе файл прокси (* args, ** kwargs) "/sequoia/data1/gcheron/lib/anaconda2/envs/detectron/lib/python2.7/site-packages/matplotlib/cbook/init.py" , линия 228, вызов вернуть файл mtd (* args, ** kwargs) "/sequoia/data1/gcheron/lib/anaconda2/envs/detectron/lib/python2.7/site-packages/matplotlib/animation.py", строка 1499, в _stop self.event_source.remove_callback (self._loop_delay) AttributeError: у объекта 'NoneType' нет атрибута 'remove_callback'

import numpy as np
from matplotlib import pyplot as plt
import matplotlib.animation
import pandas as pd


a = np.random.rand(2000, 3)*10
t = np.array([np.ones(100)*i for i in range(20)]).flatten()
df = pd.DataFrame({"time": t ,"x" : a[:,0], "y" : a[:,1], "z" : a[:,2]})


def update_graph(num):
    data=df[df['time']==num]
    graph._offsets3d = (data.x, data.y, data.z)
    title.set_text('3D Test, time={}'.format(num))


fig = plt.figure()

ax = fig.add_subplot(221, projection='3d')
#ax2 = fig.add_subplot(222, projection='3d')
title = ax.set_title('3D Test')
ax.scatter(data.x, data.y, data.z)


data=df[df['time']==0]
graph = ax.scatter(data.x, data.y, data.z)

ani = animation.FuncAnimation(fig, update_graph, 20, 
                                   interval=50, blit=True)
ani.save('motion.mp4', writer=writer)

Если я позволю это комментировать, код работает нормально, и видео содержит 4 ячейки подзаговора (3 пустые). Спасибо!

1 Ответ

0 голосов
/ 08 января 2019

При исправлении неопределенных переменных, пропущенных импортов и пропущенного оператора возврата,

from mpl_toolkits.mplot3d import Axes3D
import numpy as np
from matplotlib import pyplot as plt
import matplotlib.animation as animation
import pandas as pd

a = np.random.rand(2000, 3)*10
t = np.array([np.ones(100)*i for i in range(20)]).flatten()
df = pd.DataFrame({"time": t ,"x" : a[:,0], "y" : a[:,1], "z" : a[:,2]})

def update_graph(num):
    data=df[df['time']==num]
    graph._offsets3d = (data.x, data.y, data.z)
    title.set_text('3D Test, time={}'.format(num))
    return graph, title

fig = plt.figure()

ax = fig.add_subplot(221, projection='3d')
ax2 = fig.add_subplot(222, projection='3d')
title = ax.set_title('3D Test')
ax.scatter(df.x, df.y, df.z)

data=df[df['time']==0]
graph = ax2.scatter(data.x, data.y, data.z)

ani = animation.FuncAnimation(fig, update_graph, 20, 
                                   interval=50, blit=True)
ani.save('motion.gif', writer="imagemagick")
plt.show()

анимация выглядит так:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...