Question

J'essaie de tracer des trajectoires de lignes 3D qui évoluent avec le temps, et j'aimerais que les couleurs changent pour montrer ce passage du temps (par ex.du bleu clair au bleu foncé).Cependant, il y a un manque flagrant de tutoriels pour utiliser matplotlib. Line3DCollection; c'est le plus proche J'ai pu trouver, mais tout ce que j'obtiens, c'est une ligne blanche.

Voici mon code.

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

Cependant, voici ce que j'obtiens :

3d temporal color change plot

Juste un tas de segments de lignes blanches, aucun changement de couleur.Qu'est-ce que je fais mal?Merci!

Était-ce utile?

La solution

Votre code fonctionne simplement bien, voici un peu d'échantillon.Fondamentalement, c'est votre code avec un ensemble X personnalisé.

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

Et la parcelle ressemble à ceci:

Entrez la description de l'image ici

Autres conseils

Wow, il s'avère que le problème était que X était en fait pas de forme (3, n), mais plutôt quelque chose comme (3, n^10), mais je ne faisais que comploter n points, donc la couleur semblait ne jamais changer (et pourquoi r semble avoir des intervalles extrêmement petits... il y avait quelque chose comme 58 000 points alors que je n'en traçais que 250).

Alors oui, c'était un bug.Désolé pour ça;ça marche bien maintenant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top