Matplotlib Line3DCollection para cores que variam no tempo
-
24-12-2019 - |
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:
Apenas um monte de segmentos de linha branca, sem mudança de cor.O que estou fazendo de errado?Obrigado!
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:
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.