Frage

Ich versuche, 3D-Linientrajektorien zu zeichnen, die sich im Laufe der Zeit entwickeln, und ich möchte, dass sich die Farben ändern, um diesen Zeitablauf anzuzeigen (z. B.von Hellblau bis Dunkelblau).Allerdings mangelt es eindeutig an Tutorials zur Verwendung von Matplotlibs Line3DCollection; das ist am nächsten Ich konnte es finden, aber ich bekomme nur eine weiße Linie.

Hier ist mein 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()

Folgendes bekomme ich jedoch:

3d temporal color change plot

Nur ein paar weiße Liniensegmente, keine Farbverschiebung.Was mache ich falsch?Danke!

War es hilfreich?

Lösung

Ihr Code funktioniert einwandfrei, hier ist ein kleines Beispiel.Im Grunde ist dies Ihr Code mit einem benutzerdefinierten X-Satz.

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

Und die Handlung sieht so aus:

enter image description here

Andere Tipps

Wow, es stellte sich heraus, dass das Problem darin lag X war eigentlich nicht der Form (3, n), sondern eher so etwas wie (3, n^10), aber ich habe nur geplant n Punkte, daher schien sich die Farbe nie zu ändern (und warum). r scheint extrem kleine Intervalle zu haben ... es waren ungefähr 58.000 Punkte, als ich nur 250 zeichnete).

Also ja, es war ein Fehler.Das tut mir leid;es funktioniert jetzt gut.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top