2013-03-25 41 views
13

私はかなりの時間をグーグルで成功しませんでした。多分、私のキーワードはちょっとひどいです。とにかく、同じ長さの3つの1D numpy.ndarrayを3次元で軌道としてプロットしたいとします。また、私は次のもののいずれかを実行できるようにしたいと思います:pythonのmatplotlib.pyplotの3Dパラメトリック曲線の線の色

  1. 変更z
  2. の変更、時間の関数としての線の色の関数としての線の色を(すなわちアレイ内のインデックス)

This demoは、このような曲線を作成する例があります

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

しかし、どうすれば1または2を達成できますか?唯一のソリューションは歓迎です! ありがとうございます。

答えて

12

普通の2dプロットと同様に、通常の線に沿って色のグラデーションを付けることはできません。しかし、あなたは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() 

私はので、私はここでそれを適用@Junuxx'shackを気に入っ:

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

私は、最初の文は私の答えを参照して、正確には正しくないと思います。しかし、正常化を含むジェットカラーマップのデモンストレーションのための+1。 – Junuxx

+0

これは技術的に真実なので、 'N'' line3D'オブジェクトをプロットする必要がありますが、あなたのハックはかなり素晴らしいです:) – askewchan

+1

@ JUNUXXとaskewchanの両方に感謝してありがとうございます –

10

をあなたは別に、すべての線分をプロットすることができます以下のようになります。これは、@ askewchanの答えがすでにカラーマップの使い方をよく示しているので、あらかじめ定義された6つの色をループするだけです。

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