2013-03-25 8 views
13

Już od jakiegoś czasu googlowałem bezskutecznie ... może moje słowa kluczowe są po prostu kiepskie. W każdym razie, przypuśćmy, że mam trzy 1D numpy.ndarray s tej samej długości, które chciałbym wykreślić w 3D jako trajektorię. Ponadto, chciałbym móc zrobić jedną z następujących rzeczy:Kolor linii krzywej parametrycznej 3D w pytfla matplotlib.pyplot

  1. zmienić kolor linii w funkcji z
  2. zmienić kolor linii w funkcji czasu (tj indeks w tablicach)

This demo posiada przykład wykonania takiego krzywą:

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

Ale jak uzyskać 1 lub 2? Rozwiązania tylko jednego lub drugiego są mile widziane! Z góry dzięki.

Odpowiedz

12

Podobnie jak w przypadku normalnych wykresów 2d, nie można uzyskać gradientu koloru wzdłuż zwykłej linii. Jednak można to zrobić z scatter:

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

lubiłem @Junuxx'shack więc zastosować je tutaj:

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

Myślę, że pierwsze stwierdzenie nie jest do końca poprawne, zobaczyć moją odpowiedź. Ale +1 za demonstrację mapy kolistej, w tym normalizację. – Junuxx

+0

Cóż, jest to prawdą techniczną, dlatego musisz narysować obiekty 'N'' line3D', ale twój hack jest całkiem niezły :) – askewchan

+1

Awesome, dzięki wam zarówno @Junuxx jak i askewchan –

10

można wykreślić każdy odcinek osobno , jak pokazano niżej. To tylko pętli ponad 6 predefiniowanych kolorów, ponieważ odpowiedź @ askewchan już dobrze pokazuje, jak korzystać z mapy kolorów.

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

Powiązane problemy