2013-03-25 311 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