Python 用于时变颜色的Matplotlib Line3DCollection

Python 用于时变颜色的Matplotlib Line3DCollection,python,matplotlib,plot,mplot3d,Python,Matplotlib,Plot,Mplot3d,我正在尝试绘制随时间变化的3D直线轨迹,我希望颜色能够改变以显示时间的推移(例如,从浅蓝色到深蓝色)。但是,使用matplotlib的Line3DCollection的教程明显不足;我能找到,但我得到的只是一条白线 这是我的密码 import matplotlib.pyplot as plot from mpl_toolkits.mplot3d.axes3d import Axes3D from mpl_toolkits.mplot3d.art3d import Line3DCollection

我正在尝试绘制随时间变化的3D直线轨迹,我希望颜色能够改变以显示时间的推移(例如,从浅蓝色到深蓝色)。但是,使用matplotlib的
Line3DCollection
的教程明显不足;我能找到,但我得到的只是一条白线

这是我的密码

import matplotlib.pyplot as plot
from mpl_toolkits.mplot3d.axes3d import Axes3D
from mpl_toolkits.mplot3d.art3d import Line3DCollection
import numpy as np

# X has shape (3, n)
c = np.linspace(0, 1., num = X.shape[1])[::-1]
a = np.ones(shape = c.shape[0])
r = zip(a, c, c, a) # an attempt to make red vary from light to dark

# r, which contains n tuples of the form (r,g,b,a), looks something like this:
# [(1.0, 1.0, 1.0, 1.0), 
# (1.0, 0.99998283232330165, 0.99998283232330165, 1.0),
# (1.0, 0.9999656646466033, 0.9999656646466033, 1.0),
# (1.0, 0.99994849696990495, 0.99994849696990495, 1.0),
# ..., 
# (1.0, 1.7167676698312416e-05, 1.7167676698312416e-05, 1.0),
# (1.0, 0.0, 0.0, 1.0)]

fig = plot.figure()
ax = fig.gca(projection = '3d')

points = np.array([X[0], X[1], X[2]]).T.reshape(-1, 1, 3)
segs = np.concatenate([points[:-1], points[1:]], axis = 1)
lc = Line3DCollection(segs, colors = r)
ax.add_collection3d(lc)

ax.set_xlim(-0.45, 0.45)
ax.set_ylim(-0.4, 0.5)
ax.set_zlim(-0.45, 0.45)

plot.show()
然而,我得到的是:


只是一堆白色的线段,颜色没有变化。我做错了什么?谢谢

Wow,所以问题是
X
实际上不是形状
(3,n)
,而是类似
(3,n^10)
,但我只是绘制
n
点,因此颜色似乎从未改变(为什么
r
的间隔似乎非常小……当我仅绘制250个点时,大约有58000个点)


是的,这是一个bug。很抱歉,它现在可以正常工作了。

您的代码可以正常工作,这里有一个示例。基本上,这是一个自定义X集的代码

fig = plot.figure();
ax = fig.gca(projection = '3d')
X = [(0,0,0,1,0),(0,0,1,0,0),(0,1,0,0,0)]
points = np.array([X[0], X[1], X[2]]).T.reshape(-1, 1, 3)
r = [(1.0, 1.0, 1.0, 1.0), (1.0, 0.75, 0.75, 1.0), (1.0, 0.5, 0.5, 1.0), (1.0, 0.25, 0.25, 1.0), (1.0, 0.0, 0.0, 1.0)];

segs = np.concatenate([points[:-1], points[1:]], axis = 1)
ax.add_collection(Line3DCollection(segs,colors=list(r)))

plot.show()
情节是这样的:


什么是
r
呢?一个小样本就足够了,开头和结尾几行就好了!在其定义下面添加了
r
的结构。无意冒犯,我投票结束这个问题,因为它不太可能帮助其他读者。@Hooked:这是一个有效的代码样本,说明了如何做到这一点,并且我在网上找不到任何东西。它可能有用,我倾向于保留它…@PearsonArtPhoto这个问题对未来的读者来说没有价值,直到你发布了你的示例,这与我的评论是同时进行的。我将撤回投票。欢迎更多Matplotlib示例:)再次感谢你!这似乎是我正在寻找的。只是我不确定您的示例是否适用于我从Excel行读取点的情况,我希望线段顺序与读取顺序相同。有什么变化吗?