2013-03-25 89 views
13

我一直在Google上搜索一段時間沒有成功...也許我的關鍵字只是糟糕。無論如何,假設我有三個長度相同的長度,我想用3D作爲軌跡來繪製它們。此外,我希望能夠做任何的下列事項:python的matplotlib.pyplot中的三維參數曲線的線條顏色

  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

但我該如何實現12?只有一種或其他解決方案是受歡迎的! 在此先感謝。

回答

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 2013-03-25 14:52:19

+0

嗯,這在技術上是正確的,因此你必須繪製'N'' line3D'對象,但是你的破解是非常棒的:) – askewchan 2013-03-25 14:58:41

+1

真棒,感謝你@Junuxx和askewchan – 2013-03-25 15:11:49

10

可以分別繪製每一線段, 如下所示。這只是循環了6種預定義的顏色,因爲@ askewchan的答案已經很好地說明了如何使用顏色映射。

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