2013-03-25 20 views
13

Ich google einige Zeit ohne Erfolg ... vielleicht sind meine Keywords nur lausig. Wie auch immer, angenommen, ich habe drei 1D numpy.ndarray s der gleichen Länge, die ich sie in 3D als eine Trajektorie plotten möchte. Außerdem würde Ich mag der Lage sein, eine der beiden folgenden Dinge zu tun:Linienfarbe der parametrischen 3D-Kurve in Pythons matplotlib.pyplot

  1. ändern die Farbe der Linie als Funktion der z
  2. ändern die Farbe der Linie als Funktion der Zeit (dh der Index in den Arrays)

This demo hat ein Beispiel zur Herstellung einer solchen Kurve:

import matplotlib as mpl 
from mpl_toolkits.mplot3d import Axes3D 
import numpy as np 
import matplotlib.pyplot as plt 

fig = plt.figure() 
ax = fig.gca(projection='3d') 
theta = np.linspace(-4 * np.pi, 4 * np.pi, 100) 
z = np.linspace(-2, 2, 100) 
r = z**2 + 1 
x = r * np.sin(theta) 
y = r * np.cos(theta) 
ax.plot(x, y, z) 

plt.show() 

enter image description here

Aber wie erreiche ich 1 oder 2? Lösungen zu nur dem einen oder anderen sind willkommen! Vielen Dank im Voraus.

Antwort

12

Wie bei normalen 2D-Plots können Sie keine Farbverläufe entlang einer normalen Linie haben. Sie können jedoch mit scatter tun:

import matplotlib as mpl 
from mpl_toolkits.mplot3d import Axes3D 
import numpy as np 
import matplotlib.pyplot as plt 

fig = plt.figure() 
ax = fig.gca(projection='3d') 
theta = np.linspace(-4 * np.pi, 4 * np.pi, 100) 
z = np.linspace(-2, 2, 100) 
r = z**2 + 1 
x = r * np.sin(theta) 
y = r * np.cos(theta) 

#1 colored by value of `z` 
ax.scatter(x, y, z, c = plt.cm.jet(z/max(z))) 

#2 colored by index (same in this example since z is a linspace too) 
N = len(z) 
ax.scatter(x, y, z, c = plt.cm.jet(np.linspace(0,1,N))) 

plt.show() 

Ich mochte @Junuxx'shack so bewarb ich mich hier:

for i in xrange(N-1): 
    ax.plot(x[i:i+2], y[i:i+2], z[i:i+2], color=plt.cm.jet(255*i/N)) 

2-Color by index 2-Color lines by index

+0

Ich denke, die erste Aussage nicht ganz richtig ist, ist meine Antwort sehen. Aber +1 für die Demonstration von Jet Colormap einschließlich Normalisierung. – Junuxx

+0

Nun, es ist technisch wahr, daher müssen Sie 'N'' line3D' Objekte plotten, aber Ihr Hack ist ziemlich genial :) – askewchan

+1

Awesome, dank euch beiden @Junuxx und askewchan –

10

Sie können jedes Liniensegment separat plotten , Wie nachfolgend dargestellt. Dies führt zu einer Schleife in 6 vordefinierten Farben, da @ askewchans Antwort bereits zeigt, wie man eine Colormap verwendet.

cols = 'rgbcmy' 

for i in range(len(x)-1): 
    ax.plot(x[i:i+2], y[i:i+2], z[i:i+2], color=cols[i%6]) 

enter image description here

Verwandte Themen