如何为我的 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 颜色数组,其形状与 X
、Y
和 Z
,您可以使用颜色图和范数从第 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()
我想构建复杂函数的图形并为此使用 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 颜色数组,其形状与 X
、Y
和 Z
,您可以使用颜色图和范数从第 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()