【问题标题】:How can I colour my 3d graph, used fourth variable's value?如何为我的 3d 图形着色,使用第四个变量的值?
【发布时间】:2021-11-24 05:23:33
【问题描述】:

我想构建复杂函数的图形并为此使用 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)

你能帮帮我吗?

【问题讨论】:

  • 请使用标准导入别名import numpy as npimport matplotlib.pyplot as plt实现您的代码
  • 另外,不要使用pylab,根据Which is the recommended way to plot: matplotlib or pylab?,它被官方拒绝
  • 你在重复使用十年前的代码,... Pylab、Axes3D 已经过时了!

标签: python matplotlib graph graphics 3d


【解决方案1】:

你在重复使用十年前的代码,... Pylab、Axes3D 已经过时了!

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

ax.plot_surface 支持facecolor=array 关键字参数,其中array 是与XYYZ 形状相同的RGBA 颜色数组,您可以从第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()

【讨论】:

  • 谢谢你,非常感谢!抱歉,对于这段“旧代码”,我只是在设计并使用这段代码来理解它是如何工作的。再次感谢您,您的代码对我很有帮助!
  • @MrSparrow 不客气,感谢您认可我的回答。关于“旧代码”,它不是为了责备而是作为评论,以证明我在回答中采用的不同方法是正确的(我非常清楚,老师有​​时会将非常旧的软件扔给他们的学生……; -)。
猜你喜欢
  • 2020-08-04
  • 1970-01-01
  • 2021-03-13
  • 1970-01-01
  • 1970-01-01
  • 2021-12-03
  • 1970-01-01
  • 2018-01-13
  • 1970-01-01
相关资源
最近更新 更多