Python - matplotlib中3D线图的颜色映射

7 投票
2 回答
3997 浏览
提问于 2025-04-18 07:18

我正在尝试使用matplotlib的mplot3D工具绘制一个3D线图。我有4个数组:

  • tab_C[0] 是一个包含x值的数组
  • tab_C[1] 是一个包含y值的数组
  • tab_C[2] 是一个包含z值的数组
  • tab_t 是一个包含时间值的数组

我用以下代码绘制了我的图:

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

fig1 = plt.figure()
ax = fig1.gca(projection='3d')
ax.plot(tab_C[0], tab_C[1], tab_C[2])

plt.show()

这个图可以正常显示,但我现在想让这个图的颜色根据时间值变成彩虹色。我在matplotlib的网站上找过,但没有找到相关的信息。有没有什么建议可以解决这个问题?

2 个回答

6

你可以像Bill所展示的那样,使用纯matplotlib的方式来实现,但用Mayavi会更直观。这里有一个他们文档中的不错示例:

from mayavi import mlab
n_mer, n_long = 6, 11
dphi = np.pi / 1000.0
phi = np.arange(0.0, 2 * pi + 0.5 * dphi, dphi)
mu = phi * n_mer
x = np.cos(mu) * (1 + np.cos(n_long * mu / n_mer) * 0.5)
y = np.sin(mu) * (1 + np.cos(n_long * mu / n_mer) * 0.5)
z = np.sin(n_long * mu / n_mer) * 0.5
t = np.sin(mu)

mlab.plot3d(x, y, z, t, tube_radius=0.025, colormap='Spectral')

在这里输入图片描述

这里的参数colormap决定了使用的颜色映射,而xyzt可以用你想要的具体数组来替换。

6

这个问题没有简单的一句话就能解决的方法。不过,有一种方法也不错。你需要考虑的是如何把时间值映射到颜色上。下面是一种可能的做法:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

N_points = 10
x = np.arange(N_points, dtype=float)
y = x
z = np.random.rand(N_points)
t = x

fig = plt.figure()
ax = fig.gca(projection='3d')

# colors need to be 3-tuples with values between 0-1.
# if you want to use the time values directly, you could do something like
t /= max(t)
for i in range(1, N_points):
    ax.plot(x[i-1:i+1], y[i-1:i+1], z[i-1:i+1], c=(t[i-1], 0, 0))
plt.show()

在这里输入图片描述

你可以尝试调整那个元组。里面有一个值是两个零的话,颜色的深浅会根据非零值的位置来决定,可能会得到红色、绿色和蓝色的不同色调。还有其他可能的颜色选择,比如灰色的不同深浅

c = (t[i-1], t[i-1], t[i-1])

或者可以从一组预定义的颜色中循环选择:

# Don't do: t /= max(t)
from itertools import cycle
colors = cycle('bgrc')
for i in range(1, N_points):
    ax.plot(x[i-1:i+1], y[i-1:i+1], z[i-1:i+1], c=colors[t[i-1]])
plt.show()

不过,这个方法还得看你是怎么定义你的时间的。

撰写回答