21

私はかなり長い間グーグルをしていて成功していません...多分私のキーワードはただひどいです。とにかく、同じ長さの3つの1Dnumpy.ndarrayがあり、それらを3Dで軌道としてプロットしたいとします。さらに、次のいずれかを実行できるようにしたいと思います。

  1. の関数として線の色を変更しますz
  2. 時間の関数として線の色を変更します(つまり、配列のインデックス)

このデモには、そのような曲線を作成する例があります。

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

ここに画像の説明を入力してください

しかし、どうすれば達成できます12?どちらか一方だけの解決策は大歓迎です!前もって感謝します。

4

2 に答える 2

22

通常の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の ハックが好きだったので、ここに適用しました。

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-インデックスによる色 2-インデックスによる線の色付け

于 2013-03-25T14:34:52.750 に答える
15

以下に示すように、すべての線分を個別にプロットできます。@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])

ここに画像の説明を入力してください

于 2013-03-25T14:48:06.260 に答える