Python - 用于matplotlib的3D线性图的颜色映射

6

我想使用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的网页上搜索了很久,但没有找到相关信息。对于这个问题有什么建议吗?


它必须是一条线图吗?你肯定可以使用 ax.scatter(tab_C[0], tab_C[1], zs=tab_C[2], c=tab_t) - wflynny
这是一个线图,有没有办法把散点图变成线图? - pomxipum
2个回答

6

你可以像Bill介绍的那样用纯matploblib方式实现,但使用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可以被替换为你想要的特定数组。


谢谢。这很有帮助;但是安装所有必要的软件包以使用 mayavi 仍然有点困难。现在它可以工作了。 - LCFactorization

5

没有简单的“一行式”方法来完成这个任务。然而,有一种方法不太糟糕。你所需要考虑的唯一问题是如何将时间值映射到颜色上。以下是可能的一种方法:

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()

enter image description here

您可以尝试更改该元组。其中一个值为2个零将根据非零参数的位置给您红色、绿色和蓝色的阴影。其他可能的颜色选择可能是灰色的阴影。

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()

然而,这取决于你如何定义时间。

谢谢。它有效:D 你知道如何将colorbar添加到这个图中吗?我找到了这个 m = cm.ScalarMappable(cmap=cm.rainbow) m.set_array(tab_t) plt.colorbar(m) 但ScalarMappble没有set_label方法。 - pomxipum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接