首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >matplotlib plot_surface颜色图不与z轴缩放。

matplotlib plot_surface颜色图不与z轴缩放。
EN

Stack Overflow用户
提问于 2020-09-29 13:11:53
回答 3查看 1.1K关注 0票数 0

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

代码语言:javascript
运行
复制
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_surfacercount,或者更改Xtest或Ytest数据的间隔,但没有任何帮助。我尝试过这里这里的一些建议。但这似乎与此无关。

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

编辑

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

编辑2我相信这不是最好的解决方案。所以我才把它放在这里,而不是作为答案。正如@swatchai建议使用contour3D。由于曲面是一组线,我可以通过绘制许多等高线来生成正确的结果,方法是:

代码语言:javascript
运行
复制
surf = ax.contour3D(Xtest, Ytest, Ztest, 500, cmap=cm.plasma,
                 alpha=0.5, antialiased=False)

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-09-29 14:23:10

我不知道如何才能做到这一点,但也许是一些关于为什么会发生这种情况的话。plot_surface生成一个网格,其中顶点由xyz定义。每个补丁有4个角,并得到与其z值对应的颜色。从图上看,它可能是四个角的最大z值(只是猜测)。如果你仔细观察,当你朝+y方向移动时,斑块的颜色实际上会变浅。但是更明显的是x方向的颜色变化,产生了你提到的斜率。

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

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

票数 0
EN

Stack Overflow用户

发布于 2020-09-29 14:30:35

表面图的行为不是你所期望的。只有contour3D或contourf3D才能显示这种行为。下面是相关代码,您可以尝试获得以下情节:

代码语言:javascript
运行
复制
surf = ax.plot_surface(Xtest, Ytest, Ztest, cmap=cm.plasma, alpha=0.55)
ax.contourf3D(Xtest, Ytest, Ztest, cmap=cm.plasma)

同时显示曲面和contourf3D的图形:

票数 0
EN

Stack Overflow用户

发布于 2020-09-29 21:24:11

我想,绘制这类曲面的正式答案是使用Axes3D.contourAxes3D.contourf。例如,基于文档

代码语言:javascript
运行
复制
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。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64120358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档