Python matplotlib plot_曲面颜色贴图不随z轴缩放
我尝试使用matplotlib的plot_曲面制作简单的3D绘图,以下是最简单的示例: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
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进行了修改,这不是一个非常聪明的想法,但目前仍然有效。我希望有更多的建议来。。。我很好奇这是不是一只虫子?因为对于简单的函数,它工作得非常好。