为了账号安全,请及时绑定邮箱和手机立即绑定

matplotlibplot_surface颜色图不随z轴缩放

matplotlibplot_surface颜色图不随z轴缩放

叮当猫咪 2023-09-19 14:08:58
我尝试使用 matplotlib 的plot_surface 制作简单的 3D 绘图,下面是最小的示例:import numpy as npimport matplotlib.pyplot as pltfrom matplotlib import cmx_test = np.arange(0.001, 0.01, 0.0005)y_test = np.arange(0.1, 100, 0.05)fig = plt.figure()ax = fig.add_subplot(111, projection='3d')Xtest, Ytest = np.meshgrid(x_test, y_test)Ztest = Xtest**-1 + Ytestsurf = ax.plot_surface(Xtest, Ytest, Ztest,                       cmap=cm.plasma, alpha=1,                       antialiased=False)fig.colorbar(surf, shrink=0.5, aspect=5)ax.set_ylabel(r'$ Y $', fontsize=16)ax.set_xlabel(r'$ X $', fontsize=16)ax.set_zlabel(r'$ Z $', fontsize=16)结果给出了奇怪的颜色图,它并不代表 z 尺度的大小,正如您可以从这里看到的3D 绘图结果。我的意思是,如果你沿着 Z 轴不变的直线,你不会看到相同的颜色。我尝试更改ccountandrcount内部plot_surface函数或更改 Xtest 或 Ytest 数据的间隔,但没有任何帮助。我尝试了这里和这里的一些建议。但似乎没有关联。你能帮我解决这个问题吗?这似乎是一个简单的问题,但我无法解决。谢谢!编辑我添加了示例,但使用了我没有在这里写的原始方程(它很复杂),请看一下:Comparison。左图是在 Matlab 中完成的(由我的顾问完成),右图是使用 matplotlib 完成的。您可以清楚地看到左侧的图确实很有意义,最亮的颜色始终位于最大 z 轴上。不幸的是,我不懂matlab。我希望我可以使用 python 来做到这一点,希望这次编辑能让问题更清楚。编辑2 我确信这不是最好的解决方案。这就是为什么我把它放在这里,而不是作为答案。正如 @swatchai 建议使用contour3D. 由于曲面是一组线,因此我可以通过绘制大量轮廓线来生成正确的结果,方法是:surf = ax.contour3D(Xtest, Ytest, Ztest, 500, cmap=cm.plasma,                  alpha=0.5, antialiased=False)正如您可以从这里看到的那样,颜色图是正确的alternative1 但情节非常沉重。当你放大时,它看起来不太好,除非你再次增加轮廓的数量。欢迎任何建议:)。
查看完整描述

3 回答

?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

我不知道如何实现这一点,但也许可以解释一下为什么会发生这种情况。 plot_surface生成一个网格,其中顶点由xy和定义z。每个面片都有 4 个角,并获得与其 z 值相对应的颜色。查看该图,它可能是 4 个角的最大 z 值(只是猜测)。如果您仔细观察,当您向 +y 方向移动时,色块的颜色实际上会变浅。但更明显的是x方向上的颜色变化,产生了你提到的斜坡。

但如果每个补丁只有单一颜色,这就无法避免。

如果将公式更改为,您可能会更清楚地看到这一点Z = (X**-1 + 10 * Y)

https://img1.sycdn.imooc.com//65093b3000011e8206510542.jpg

查看完整回答
反对 回复 2023-09-19
?
慕丝7291255

TA贡献1859条经验 获得超6个赞

曲面图的行为不是您所期望的。只有contour3D 或contourf3D 可以显示此类行为。这是相关代码,您可以尝试获取以下情节:

surf = ax.plot_surface(Xtest, Ytest, Ztest, cmap=cm.plasma, alpha=0.55)
ax.contourf3D(Xtest, Ytest, Ztest, cmap=cm.plasma)

显示曲面和轮廓的图:

https://img1.sycdn.imooc.com//65093b3e00017d5705190353.jpg

查看完整回答
反对 回复 2023-09-19
?
弑天下

TA贡献1818条经验 获得超7个赞

我想,绘制这种曲面的正式答案是使用Axes3D.contourAxes3D.contourf。例如:

surf2 = ax.contourf(Xtest, Ytest, Ztest, 250, cmap=cm.plasma,
                    alpha=0.6, antialiased=False)
surf = ax.contour(Xtest, Ytest, Ztest, 250, cmap=cm.plasma,
                  alpha=0.6, antialiased=False)

颜色图显示正确的 z 比例。它不像光滑表面那么完美,因为这取决于我们缩放多少或放置轮廓多少。我不知道是否有办法通过plot_surface创建它。


查看完整回答
反对 回复 2023-09-19
  • 3 回答
  • 0 关注
  • 73 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信