21

我已经在谷歌上搜索了一段时间但没有成功……也许我的关键字很糟糕。无论如何,假设我有三个numpy.ndarray相同长度的 1D s,我想将它们绘制为 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()

在此处输入图像描述

但是我如何实现1or 2?欢迎仅解决其中一个问题!提前致谢。

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 的 hack,所以我在这里应用了它:

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

您可以分别绘制每条线段,如下所示。这只是循环了 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])

在此处输入图像描述

于 2013-03-25T14:48:06.260 回答