matplotlib plot_surface 颜色图不随 z 轴缩放
matplotlib plot_surface colormap does not scale with the z-axis
我尝试使用 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 不变的直线,你就看不到相同的颜色。
我尝试更改 plot_surface
函数内的 ccount
和 rcount
或更改 Xtest 或 Ytest 数据的间隔,但没有任何帮助。
我尝试了 and 的一些建议。不过好像没有关系。
你能帮我解决这个问题吗?这似乎是一个简单的问题,但我无法解决。
谢谢!
编辑
我加了例子,但是用的是原方程,这里就不写了(很复杂),请看: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
但是剧情很沉重。当你放大时,它看起来不太好,除非你再次增加轮廓的数量。
欢迎任何建议:).
我不知道这是如何实现的,但也许可以说说为什么会这样。
plot_surface
生成一个网格,其中顶点由 x
和 y
和 z
定义。
每个补丁有 4 个角,并获得与其 z 值对应的颜色。看着情节吧
可能是 4 个角的最大 z 值(只是一个猜测)。
如果你仔细观察,当你向 +y 方向移动时,补丁的颜色实际上会变亮。
但更明显的是 x
方向的颜色变化,产生你提到的斜率。
但如果每个补丁只有一种颜色,就无法避免这种情况。
如果将公式更改为 Z = (X**-1 + 10 * Y)
,您可能会更清楚地看到这一点
曲面图的行为不是您所期望的。只有 contour3D 或 contourf3D 可以显示此类行为。这是相关代码,您可以尝试获取以下情节:
surf = ax.plot_surface(Xtest, Ytest, Ztest, cmap=cm.plasma, alpha=0.55)
ax.contourf3D(Xtest, Ytest, Ztest, cmap=cm.plasma)
同时显示曲面和轮廓 f3D 的绘图:
我想,绘制这种曲面的正式答案是使用 Axes3D.contour
和 Axes3D.contourf
。基于 documentation
,例如:
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)
结果是here。颜色图显示正确 z-scale。
它不像光滑表面那么完美,因为它取决于我们将其缩放多少或放置轮廓的多少。我不知道是否有办法通过 plot_surface 创建它。谢谢@swatchai。
我尝试使用 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 不变的直线,你就看不到相同的颜色。
我尝试更改 plot_surface
函数内的 ccount
和 rcount
或更改 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 但是剧情很沉重。当你放大时,它看起来不太好,除非你再次增加轮廓的数量。 欢迎任何建议:).
我不知道这是如何实现的,但也许可以说说为什么会这样。
plot_surface
生成一个网格,其中顶点由 x
和 y
和 z
定义。
每个补丁有 4 个角,并获得与其 z 值对应的颜色。看着情节吧
可能是 4 个角的最大 z 值(只是一个猜测)。
如果你仔细观察,当你向 +y 方向移动时,补丁的颜色实际上会变亮。
但更明显的是 x
方向的颜色变化,产生你提到的斜率。
但如果每个补丁只有一种颜色,就无法避免这种情况。
如果将公式更改为 Z = (X**-1 + 10 * Y)
曲面图的行为不是您所期望的。只有 contour3D 或 contourf3D 可以显示此类行为。这是相关代码,您可以尝试获取以下情节:
surf = ax.plot_surface(Xtest, Ytest, Ztest, cmap=cm.plasma, alpha=0.55)
ax.contourf3D(Xtest, Ytest, Ztest, cmap=cm.plasma)
同时显示曲面和轮廓 f3D 的绘图:
我想,绘制这种曲面的正式答案是使用 Axes3D.contour
和 Axes3D.contourf
。基于 documentation
,例如:
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)
结果是here。颜色图显示正确 z-scale。 它不像光滑表面那么完美,因为它取决于我们将其缩放多少或放置轮廓的多少。我不知道是否有办法通过 plot_surface 创建它。谢谢@swatchai。