Matplotlib Line3DCollection для изменяющихся во времени цветов

Я пытаюсь построить траектории трехмерных линий, которые развиваются с течением времени, и я хотел бы, чтобы цвета менялись, чтобы показать это течение времени (например, от светло-голубого до темно-синего). Однако явно не хватает руководств по использованию 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()

Однако вот что я получаю:

трехмерный график временного изменения цвета

Просто куча белых отрезков, без изменения цвета. Что я делаю не так? Спасибо!


person Magsol    schedule 27.02.2014    source источник
comment
Как выглядит r? Достаточно небольшой выборки, несколько строк в начале и в конце было бы здорово!   -  person PearsonArtPhoto    schedule 27.02.2014
comment
Добавлена ​​структура r под его определением.   -  person Magsol    schedule 27.02.2014


Ответы (2)


Ваш код работает отлично, вот небольшой пример. По сути, это ваш код с пользовательским набором 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()

А сюжет выглядит так:

введите здесь описание изображения

person PearsonArtPhoto    schedule 27.02.2014
comment
Дополнительные примеры Matplotlib всегда приветствуются :) Еще раз спасибо! - person Magsol; 28.02.2014
comment
Кажется, это то, что я ищу. просто я не уверен, что ваш пример работает для случая, когда я читаю точки из строк Excel, и я хочу, чтобы порядок сегментов был таким же, как порядок чтения. должно что-то измениться? - person FabioSpaghetti; 24.06.2019

Вау, оказывается, проблема была в том, что X на самом деле не формы (3, n), а скорее что-то вроде (3, n^10), но я рисовал только n точки, поэтому цвет, казалось, никогда не менялся (и почему r кажется, имеет очень маленькие интервалы ... было что-то вроде 58 000 точек, когда я рисовал только 250).

Так что да, это был баг. Извини за это; теперь он работает нормально.

person Magsol    schedule 27.02.2014
comment
Без всякого неуважения я голосую за закрытие этого вопроса, поскольку он вряд ли поможет другим читателям. - person Hooked; 28.02.2014
comment
@Hooked: Это правильный пример кода, как это сделать, и в Интернете я ничего не могу найти. Это может быть полезно, я был бы склонен держать его при себе... - person PearsonArtPhoto; 28.02.2014
comment
@PearsonArtPhoto Вопрос не имел ценности для будущих читателей, пока вы не опубликовали свой пример, который был опубликован одновременно с моим комментарием. Я отзову закрытое голосование. - person Hooked; 28.02.2014