Python matplotlib plot_曲面颜色贴图不随z轴缩放

Python matplotlib plot_曲面颜色贴图不随z轴缩放,python,matplotlib,plot,3d,Python,Matplotlib,Plot,3d,我尝试使用matplotlib的plot_曲面制作简单的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, projecti

我尝试使用matplotlib的plot_曲面制作简单的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比例的大小,从这里可以看到。 我的意思是,如果你取一条恒定Z的直线,你看不到相同的颜色。 我试图更改
ccount
rcount
内部
plot\u surface
函数或更改Xtest或Ytest数据的间隔,但没有任何帮助。 我试过和的一些建议。但这似乎没有关系

你能帮我解决这个问题吗?这似乎是个简单的问题,但我解决不了。 谢谢

编辑

我添加了一个例子,但使用了我没有在这里写的原始公式(它很复杂),请看:。 而左图是在Matlab中完成的(由我的导师完成), 使用matplotlib显示右侧图形。 你可以清楚地看到左边的情节很有意义, 最亮的颜色始终位于最大z轴上。不幸的是,我不懂matlab。我希望我能用python来做, 希望这次编辑能更清楚地说明这个问题

编辑2 我相信这不是最好的解决办法。这就是为什么我把它放在这里,而不是作为一个答案。按照@swatchai的建议,使用
轮廓3D
。 由于曲面是一组直线,我可以通过使用以下方法绘制大量等高线来生成正确的结果:

surf = ax.contour3D(Xtest, Ytest, Ztest, 500, cmap=cm.plasma,
                 alpha=0.5, antialiased=False)
从这里可以看到,颜色贴图是正确的 但是情节很重。放大时,除非再次增加轮廓的数量,否则效果并不理想。
欢迎提出任何建议:)。

我不知道如何做到这一点,但也许可以谈谈为什么会发生这种情况。
plot\u 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
。基于 ,例如:

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创建这个。谢谢@swatchai。

谢谢@scleronomic,我意识到y方向的颜色会变浅。但是,如果我们看一下y-z平面,它看起来很奇怪,因为值“jump”超过了“line”。我曾尝试增加X,Y间隔(直到我的电脑停止工作),但仍然不够平滑。我试着编辑和添加我想要达到的目标的例子。谢谢!
轮廓
功能结果是有意义的。你的意思是,作为连续曲面(如Matlab示例中的曲面),真的没有办法做到这一点吗?@tetukowski对此一无所知。相关操作是将
contourf
图像覆盖到matplotlib可以实现的连续曲面上。感谢@swatchai,我使用了大量contourf进行了修改,这不是一个非常聪明的想法,但目前仍然有效。我希望有更多的建议来。。。我很好奇这是不是一只虫子?因为对于简单的函数,它工作得非常好。