Python's matplotlib.pyplot中3D参数曲线的线条颜色

22 投票
2 回答
14218 浏览
提问于 2025-04-17 20:13

我在网上搜索了很久,但一直没找到合适的答案……可能是我用的关键词不太好。总之,假设我有三个长度相同的一维 numpy.ndarray 数组,我想把它们绘制成三维的轨迹。此外,我还希望能做到以下任意一项:

  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 呢?只要解决其中一个问题也很好!谢谢大家。

2 个回答

16

你可以把每一条线段单独画出来,就像下面这样。这段代码只是循环使用了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])

在这里输入图片描述

25

和普通的二维图一样,你不能在一条普通的线条上实现颜色渐变。不过,你可以通过使用 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))

按索引着色的两种颜色 按索引着色的两种颜色线条

撰写回答