如何为我的 3d 图着色,使用第四个变量的值?

How can I colour my 3d graph, used fourth variable's value?

我想构建复杂函数的图形并为此使用 Matplotlib。但它只能可视化三个变量的值,我希望我的图表颜色与第四个变量的值一样亮。 Matplotlib 只允许使用第三个变量的值来做到这一点。 我的代码(仍然没有第四个变量):

import pylab as pl
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.colors import LinearSegmentedColormap
from matplotlib import cm
import numpy as np

def makeData ():
    x = np.arange (-10, 10, 0.1)
    y = np.arange (-10, 10, 0.1)
    xgrid, ygrid = np.meshgrid(x, y)
    zgrid = np.sin (xgrid) * np.sin (ygrid) / (xgrid * ygrid)
    return xgrid, ygrid, zgrid

x, y, z = makeData()

fig = pl.figure()
axes = Axes3D(fig, auto_add_to_figure=False)
fig.add_axes(axes)

axes.plot_surface(x, y, z, rstride=4, cstride=4, cmap = cm.jet)
pl.show()

正是这段代码使用了 z 值和颜色图:

axes.plot_surface(x, y, z, rstride=4, cstride=4, cmap = cm.jet)

你能帮帮我吗?

您正在重用十年前的代码,... Pylab、Axes3D 非常过时!

我将向您展示如何使用现代 Matplotlib 实现您的想法。

ax.plot_surface 支持 facecolor=array 关键字参数,其中 array 是一个 RGBA 颜色数组,其形状与 XYZ,您可以使用颜色图和范数从第 4 个值的数组生成。

In [31]: import numpy as np
    ...: import matplotlib as mp
    ...: import matplotlib.pyplot as plt
    ...: 
    ...: fig, ax = plt.subplots(subplot_kw=dict(projection="3d"),
    ...:                        constrained_layout=1)
    ...: x = y = np.linspace(0, 1, 11)
    ...: X, Y = np.meshgrid(x, y)
    ...: Z = X+Y # elevations
    ...: V = X-Y # 4th value
    ...: 
    ...: norm = plt.Normalize(vmin=V.min().min(), vmax=V.max().max())
    ...: ax.plot_surface(X, Y, V, facecolors=plt.cm.plasma(norm(V)))
    ...: m = mp.cm.ScalarMappable(cmap=plt.cm.plasma, norm=norm)
    ...: plt.colorbar(m)
    ...: plt.show()