使用不带参数形式的matplotlib打印x^2+y^2=z^2=1

2024-10-03 11:25:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我想绘制单位球体x^2+y^2+z^2=1&;我正在尝试使用sympy、numpy和matplotlib实现同样的功能。 下面是一段代码片段:

x,y = sp.symbols('x y')

def g(x,y):
    return sqrt(1-x**2 - y**2)
xrange2 = np.linspace(-1, 1, 100)
yrange2 = np.linspace(-1, 1, 100)
X2, Y2 = np.meshgrid(xrange2, yrange2)
Z2 = g(X2, Y2)
Z2[(1- X2**2 - Y2**2 < 0)] = np.nan
Z2[(1- X2**2 - Y2**2 > 0)] = np.nan
ax.plot_surface(X2, Y2, Z2,cmap='Blues', antialiased=True, edgecolor='black')

我不希望对球体使用参数方程,而是使用x、y和z绘制它。 当前正在获取以下错误: Z包含NaN值。这可能会导致渲染瑕疵


Tags: numpymatplotlibnp绘制单位nanampx2
1条回答
网友
1楼 · 发布于 2024-10-03 11:25:27

从这个问题来看,很不清楚使用的是哪个版本的sqrt。Sympy的sqrt当然不会起作用math.sqrt在数组上不起作用。只有np.sqrt可以工作。但是,函数g需要进行numpy矢量化

np.sqrt在数组上工作,在负数上操作时给出NaN

ax.plot_surface不希望在某些Z值为NaN时绘制彩色贴图面,在这种情况下,它只绘制普通颜色。请注意,抗锯齿不适用于打印面,仅适用于边

要绘制完整的球体,需要同时绘制Z2-Z2

由于NaN和一个不定义均匀分布点的方程,会出现一些瑕疵。此外,表面不会完全填满。请参见this post以通过角度表示绘制球体

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np

@np.vectorize
def g(x,y):
    return np.sqrt(1-x**2 - y**2)

fig = plt.figure()
ax = fig.gca(projection='3d')

xrange2 = np.linspace(-1, 1, 100)
yrange2 = np.linspace(-1, 1, 100)
X2, Y2 = np.meshgrid(xrange2, yrange2)
Z2 = g(X2, Y2)
ax.plot_surface(X2, Y2, -Z2, color='lightblue', antialiased=True, edgecolor='black')
ax.plot_surface(X2, Y2, Z2, color='lightblue', antialiased=True, edgecolor='black')

plt.show()

resulting plot

注意,代码中并没有真正使用sympy(defg(x,y)使用标准Python变量x和y的自己版本)。此外,混合使用numpy和sympy也不起作用This related post通过sympy将曲面打印为参数曲面。请注意,这些参数化曲面仅适用于2个变量,在这种情况下,x、y和z定义为φ和θ的函数。据我所知,绘制一个通用的3D方程目前不适用于Symphy

相关问题 更多 >