【问题标题】:Why can't I add several projection 3d subplots to my matplotlib animation?为什么我不能在我的 matplotlib 动画中添加几个投影 3d 子图?
【发布时间】:2019-06-03 03:01:40
【问题描述】:

我无法向我的图形添加第二个投影 3d 轴。 如果我取消注释 ax2 的行,我会收到错误:

Traceback(最近一次调用最后一次):文件 "/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 个为空)。谢谢!

【问题讨论】:

  • 您能否确保如果有人尝试运行您的代码,他们实际上会看到您报告的错误,而不是一些未定义的变量、缺少导入和缺少返回语句? (minimal reproducible example)

标签: python matplotlib


【解决方案1】:

在纠正未定义的变量、缺少导入和缺少返回语句时,

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()

动画如下所示:

【讨论】:

  • 谢谢!实际上,我已经重新启动了我的 jupyter 内核并且我不再有这个错误......我认为与某些 plt 配置存在冲突。很抱歉变量(在另一个单元格中定义)。
猜你喜欢
  • 1970-01-01
  • 2021-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多