Python 3D GIF中的颜色栏

Python 3D GIF中的颜色栏,python,matplotlib,3d,colorbar,Python,Matplotlib,3d,Colorbar,所以我试图在一个盒子里画出粒子的运动,并想用一个色条来可视化速度。我的代码如下所示 import numpy as np import matplotlib.pyplot as plt import matplotlib.cm as cm from matplotlib.animation import FuncAnimation from mpl_toolkits.mplot3d import Axes3D from mpl_toolkits.axes_grid1 import make_ax

所以我试图在一个盒子里画出粒子的运动,并想用一个色条来可视化速度。我的代码如下所示

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm
from matplotlib.animation import FuncAnimation
from mpl_toolkits.mplot3d import Axes3D
from mpl_toolkits.axes_grid1 import make_axes_locatable

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
div = make_axes_locatable(ax)
cax = div.append_axes('right', size='15%', pad='5%')
tx = ax.set_title('Timestep 0')

def update(t):
    tx.set_text('Timestep {0}'.format(t))
    X,Y,Z,u,v,w=np.random.rand(6,6)
    track = ax.scatter(X, Y, Z, s=1, c=np.linalg.norm([u, v, w], axis=0), cmap=plt.cm.get_cmap('inferno'))
    cax.cla()
    plt.colorbar(track,cax=cax)
    return track, ax

if __name__ == '__main__':
    anim = FuncAnimation(fig, update, frames=np.arange(10), interval=100, blit=False)
    anim.save('ClusterTrajectories.gif', dpi=150, writer='imagemagick')
然而,如果我运行它,我会得到以下错误

  Traceback (most recent call last):
  File "<stdin>", line 3, in <module>
  File "/home/itvmi/.local/lib/python2.7/site-packages/matplotlib/animation.py", line 1007, in save
    anim._init_draw()
  File "/home/itvmi/.local/lib/python2.7/site-packages/matplotlib/animation.py", line 1490, in _init_draw
    self._draw_frame(next(self.new_frame_seq()))
  File "/home/itvmi/.local/lib/python2.7/site-packages/matplotlib/animation.py", line 1512, in _draw_frame
    self._drawn_artists = self._func(framedata, *self._args)
  File "<stdin>", line 6, in update
  File "/home/itvmi/.local/lib/python2.7/site-packages/matplotlib/pyplot.py", line 2262, in colorbar
    ret = gcf().colorbar(mappable, cax = cax, ax=ax, **kw)
  File "/home/itvmi/.local/lib/python2.7/site-packages/matplotlib/figure.py", line 1602, in colorbar
    cb = cbar.colorbar_factory(cax, mappable, **kw)
  File "/home/itvmi/.local/lib/python2.7/site-packages/matplotlib/colorbar.py", line 1347, in colorbar_factory
    cb = Colorbar(cax, mappable, **kwargs)
  File "/home/itvmi/.local/lib/python2.7/site-packages/matplotlib/colorbar.py", line 926, in __init__
    ColorbarBase.__init__(self, ax, **kw)
  File "/home/itvmi/.local/lib/python2.7/site-packages/matplotlib/colorbar.py", line 325, in __init__
    self.config_axis()
  File "/home/itvmi/.local/lib/python2.7/site-packages/matplotlib/colorbar.py", line 360, in config_axis
    ax.yaxis.set_label_position(self.ticklocation)
  File "/home/itvmi/.local/lib/python2.7/site-packages/matplotlib/axis.py", line 1811, in set_label_position
    raise ValueError(msg)
ValueError: Position accepts only [ 'top' | 'bottom' ]
回溯(最近一次呼叫最后一次):
文件“”,第3行,在
文件“/home/itvmi/.local/lib/python2.7/site packages/matplotlib/animation.py”,第1007行,保存
动画片
文件“/home/itvmi/.local/lib/python2.7/site packages/matplotlib/animation.py”,第1490行,在_init_draw中
self.\u draw\u frame(下一步(self.new\u frame\u seq()))
文件“/home/itvmi/.local/lib/python2.7/site packages/matplotlib/animation.py”,第1512行,在绘图框中
self.\u drawing\u artists=self.\u func(框架数据,*self.\u参数)
文件“”,第6行,正在更新中
colorbar中的文件“/home/itvmi/.local/lib/python2.7/site packages/matplotlib/pyplot.py”,第2262行
ret=gcf().colorbar(可映射,cax=cax,ax=ax,**千瓦)
文件“/home/itvmi/.local/lib/python2.7/site packages/matplotlib/figure.py”,第1602行,颜色栏
cb=cbar.colorbar_工厂(cax,可映射,**kw)
colorbar_工厂中的文件“/home/itvmi/.local/lib/python2.7/site packages/matplotlib/colorbar.py”,第1347行
cb=颜色条(cax,可映射,**kwargs)
文件“/home/itvmi/.local/lib/python2.7/site packages/matplotlib/colorbar.py”,第926行,在__
色度基准。初始功率(自身,最大功率,**kw)
文件“/home/itvmi/.local/lib/python2.7/site packages/matplotlib/colorbar.py”,第325行,在__
self.config_axis()
文件“/home/itvmi/.local/lib/python2.7/site packages/matplotlib/colorbar.py”,第360行,在配置轴中
ax.yaxis.set_标签_位置(self.ticklocation)
文件“/home/itvmi/.local/lib/python2.7/site packages/matplotlib/axis.py”,第1811行,处于设置标签位置
提升值错误(msg)
ValueError:位置仅接受['top'|'bottom']
不幸的是,我现在不知道该怎么办,因为我没有使用标签。我见过其他的例子,但它不是一个3d轴。。。
如果有人知道该怎么做,那就太好了,提前谢谢你。

我想是mpl\U工具包。axes\u grid1从未测试过3D绘图。至少这里的问题来自
make\u axes\u locatable
。相反,如果创建法线轴,如

cax = fig.add_subplot(1,30,30)
它很好用

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm
from matplotlib.animation import FuncAnimation
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
cax = fig.add_subplot(1,30,30)

tx = ax.set_title('Timestep 0')

def update(t):
    tx.set_text('Timestep {0}'.format(t))
    X,Y,Z,u,v,w=np.random.rand(6,6)
    track = ax.scatter(X, Y, Z, s=1, c=np.linalg.norm([u, v, w], axis=0), cmap=, cmap='inferno')
    cax.cla()
    plt.colorbar(track,cax=cax)
    return track, ax

if __name__ == '__main__':
    anim = FuncAnimation(fig, update, frames=np.arange(10), interval=100, blit=False)
    anim.save('ClusterTrajectories.gif', dpi=150, writer='imagemagick')
或者,为了避免重叠,可以使用
GridSpec
作为

from matplotlib.gridspec import GridSpec

gs = GridSpec(1,30)
fig = plt.figure()
ax = fig.add_subplot(gs[:-1], projection='3d')
cax = fig.add_subplot(gs[-1])

如果你能提供一个,也就是说,一个没有未定义变量的代码,因此是可运行的,那就太好了。这使得定位问题变得更加容易。通过复制问题中的代码并运行它,您可以轻松检查是否创建了问题。如果它随后产生与您想要询问的相同的错误,那么您就完成了。不过,这里的情况似乎并非如此。感谢您的建议,它现在会产生相同的错误