Pergunta

Estou tentando traçar trajetórias de linhas 3D que evoluem ao longo do tempo e gostaria que as cores mudassem para mostrar essa passagem do tempo (por exemplo,do azul claro ao azul escuro).No entanto, há uma clara falta de tutoriais para usar o matplotlib Line3DCollection; este é o mais próximo Eu poderia encontrar, mas tudo que consigo é uma linha branca.

Aqui está meu código.

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

No entanto, aqui está o que recebo:

3d temporal color change plot

Apenas um monte de segmentos de linha branca, sem mudança de cor.O que estou fazendo de errado?Obrigado!

Foi útil?

Solução

Seu código funciona muito bem, aqui está um exemplo.Basicamente, este é o seu código com um conjunto X personalizado.

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

E o enredo fica assim:

enter image description here

Outras dicas

Uau, então acontece que o problema era que X foi na verdade não de forma (3, n), mas sim algo como (3, n^10), mas eu estava apenas planejando n pontos, portanto a cor parecia nunca mudar (e por que r parece ter intervalos extremamente pequenos...havia algo em torno de 58.000 pontos quando eu estava plotando apenas 250).

Então sim, foi um bug.Desculpe por isso;funciona bem agora.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top