首页 > 解决方案 > matplotlib plot_surface 颜色图不随 z 轴缩放

问题描述

我尝试使用 matplotlib 的 plot_surface 制作简单的 3D 图,下面是最小示例:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
x_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 + Ytest

surf = 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 plot result。我的意思是,如果您采用恒定 Z 的直线,您将看不到相同的颜色。我尝试更改ccountand rcountinsideplot_surface函数或更改 Xtest 或 Ytest 数据的间隔,没有任何帮助。我从这里这里尝试了一些建议。但这似乎没有关系。

你能帮我解决这个问题吗?这似乎是一个简单的问题,但我无法解决。谢谢!

编辑

我添加了示例,但使用了我不在这里写的原始方程(它很复杂),请看一下:比较。左图是在 Matlab 中完成的(由我的顾问),右图是使用 matplotlib 完成的。你可以清楚地看到左边的情节真的很有意义,最亮的颜色总是在最大的 z 轴上。不幸的是,我不知道matlab。我希望我可以通过使用 python 来做到这一点,希望这个编辑可以更清楚地解决这个问题。

编辑 2 我确定这不是最好的解决方案。这就是为什么我把它放在这里,而不是作为答案。正如@swatchai 建议的那样,使用contour3D. 由于表面是一组线,我可以通过使用以下方法绘制大量等高线来生成正确的结果:

surf = ax.contour3D(Xtest, Ytest, Ztest, 500, cmap=cm.plasma,
                 alpha=0.5, antialiased=False)

颜色图是正确的,你可以从这里看到alternative1 但是情节很重。当你放大时,它看起来并不好,除非你再次增加轮廓的数量。欢迎任何建议:)。

标签: pythonmatplotlibplot3d

解决方案


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

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

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


推荐阅读