我尝试用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标度的大小,从这里你可以看到三维绘图结果。我的意思是,如果你取一直线常量Z,你就不会看到相同的颜色。我试图在ccount
函数中更改plot_surface
和rcount
,或者更改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,但情节非常重。当你放大,它看起来不好,除非你再次增加轮廓的数目。欢迎任何建议:)。
发布于 2020-09-29 14:23:10
我不知道如何才能做到这一点,但也许是一些关于为什么会发生这种情况的话。plot_surface
生成一个网格,其中顶点由x
、y
和z
定义。每个补丁有4个角,并得到与其z值对应的颜色。从图上看,它可能是四个角的最大z值(只是猜测)。如果你仔细观察,当你朝+y方向移动时,斑块的颜色实际上会变浅。但是更明显的是x
方向的颜色变化,产生了你提到的斜率。
但是,如果每个补丁只有一个颜色,这是无法避免的。
如果将公式改为Z = (X**-1 + 10 * Y)
,您可能会更清楚地看到这一点。
发布于 2020-09-29 14:30:35
表面图的行为不是你所期望的。只有contour3D或contourf3D才能显示这种行为。下面是相关代码,您可以尝试获得以下情节:
surf = ax.plot_surface(Xtest, Ytest, Ztest, cmap=cm.plasma, alpha=0.55)
ax.contourf3D(Xtest, Ytest, Ztest, cmap=cm.plasma)
同时显示曲面和contourf3D的图形:
发布于 2020-09-29 21:24:11
我想,绘制这类曲面的正式答案是使用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。
https://stackoverflow.com/questions/64120358
复制相似问题