首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ax.plot_surface不提供颜色

ax.plot_surface不提供颜色
EN

Stack Overflow用户
提问于 2013-12-15 19:56:09
回答 2查看 934关注 0票数 1

我正在尝试制作3d图,因为wolfram不能处理eq。但python似乎也遇到了麻烦。我基本上使用了surf plot示例:http://matplotlib.org/mpl_toolkits/mplot3d/tutorial.html,但它不起作用。有人知道为什么吗?

代码语言:javascript
运行
复制
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
ax = fig.gca(projection='3d')
x = y = np.arange(-10, 10, 0.25)
x,y = np.meshgrid(x,y)

z = (2*x**2 *(np.sqrt(x**2-4 * x+y**2+8)+ np.sqrt(x**2+4 * x+y**2+8))-x*(y**2-4)*
     (np.sqrt(x**2-4 * x+y**2+8)-np.sqrt(x**2+4 * x+y**2+8))-2*(y**2+4)+(np.sqrt(x**2-4 * x+y**2+8)+np.sqrt(x**2+4 * x+y**2+8))+x**3 *
     (np.sqrt(x**2+4 * x+y**2+8)-np.sqrt(x**2-4 * x+y**2+8)))/((x**2-4 * x+y**2+4) * np.sqrt(x**2-4 * x+y**2+8)*(x**2+4 * x+y**2+4)*np.sqrt(x**2+4 * x+y**2+8))

surf = ax.plot_surface(x,y,z, rstride=1, cstride=1, cmap=cm.coolwarm,
        linewidth=0, antialiased=False)
ax.set_zlim(-0.1, 0.1)

ax.zaxis.set_major_locator(LinearLocator(10))
ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f'))

fig.colorbar(surf, shrink=0.5, aspect=5)

plt.show()
EN

回答 2

Stack Overflow用户

发布于 2013-12-16 00:27:57

问题是z表面是非常尖峰的形状,实际上是z.max( ) = inf。您可以做的一件事是用有限的最大值替换无限大的值:

代码语言:javascript
运行
复制
z[ np.isinf( z )] = z[ np.isfinite(z)].max( )

这将为您提供下面的图。请注意,我没有设置z限制( ax.set_zlim ),因此整个形状都是可见的。

如果您只对[-.1, .1]之间的绘图部分感兴趣,则可以通过以下方式截断这些点处的z

代码语言:javascript
运行
复制
z[ z > .1 ] = .1
z[ z < -.1 ] = -.1

你将会得到:

票数 2
EN

Stack Overflow用户

发布于 2013-12-16 00:28:42

有几件事--首先,如果你将公共元素赋给变量,你的计算速度会更快。例如,

代码语言:javascript
运行
复制
np.sqrt(x**2 - 4*x + y**2 + 8)
np.sqrt(x**2 + 4*x + y**2 + 8)

在你的mega-z方程中被多次使用。将这些计算的结果赋给变量,然后在构建z时使用这些变量。您将能够更容易地发现错误,并节省CPU周期:

代码语言:javascript
运行
复制
a = np.sqrt(x**2 - 4*x + y**2 + 8)
b = np.sqrt(x**2 + 4*x + y**2 + 8)

c = (2*x**2 *(a + b)-x*(y**2 - 4) * (a - b)-2*(y**2+4)+(a + b)+x**3 * (b - a))
d = (x**2-4 * x+y**2+4) * a*(x**2+4 * x+y**2+4)*b

z = c / d

你的程序不工作的原因是因为你的庞大的z =方程式中的某个地方有一个被零除的错误。我会让你来追踪它,但你可能想要做的一件事是仔细检查你的等式,并确保你在适当的地方有括号。

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

https://stackoverflow.com/questions/20594207

复制
相关文章

相似问题

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