【问题标题】:How to plot a sphere in matplotlib using cartesian co-ordinates?如何使用笛卡尔坐标在 matplotlib 中绘制球体?
【发布时间】:2019-12-29 01:16:01
【问题描述】:

我想使用 matplotlib 绘制一个单位半径的球体。大多数示例和文档都是通过使用极坐标来完成的,我的方法是使用笛卡尔坐标。当我只使用 np.sqrt 编写代码时只显示了上半部分,所以我定义了一个函数 sq 只接收错误消息ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

import numpy as np
import matplotlib.pyplot as plt
def sq(x):
    if x>=0:
        return np.sqrt(x)
    else:
        return -np.sqrt(abs(x))
ax = plt.axes(projection="3d")
xlist=np.linspace(-1.0,1.0,50)
ylist=np.linspace(-1.0,1.0,50)
r=np.linspace(1.0,1.0,50)
X,Y= np.meshgrid(xlist,ylist)
Z=sq(r**2-X**2-Y**2)
cp=ax.plot_wireframe(X,Y,Z,color="r")
plt.title('The unit sphere')
plt.show()

如何编辑也显示下部的程序?

【问题讨论】:

  • 大约一半的值 >= 0,另一半 = 0?” numpy 很困惑,因为它不知道您是否想知道 any 值或 all 值是否意味着更大的零。除此之外,该方法只会给您一个半球体,因此无论如何您都需要两个线框图,在这种情况下您不应该遇到问题。
  • x 是一个数组数组
  • 为什么不把你的正半球画两次呢? cp2=ax.plot_wireframe(X,Y,-Z,color="r")
  • 我应该澄清一下,我的意思是情节 1 是正数,而 1 是负数,因为它们使用相同的 x,y 网格。

标签: python numpy matplotlib plot 3d


【解决方案1】:

如果您需要正在创建的半球的另一半,只需绘制相同的半球但为负。您的方法不起作用,因为对于给定的 x,y 坐标,您需要 2 个值(即 +/- z)。因此,即使您将给定负 X 的 Z 值设置为负,您仍然无法获得球体。如果您想要更平滑的绘图,则需要使用极坐标计算来获得正确的球体边界值。

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

ax = plt.axes(projection="3d")
xlist=np.linspace(-1.0,1.0,50)
ylist=np.linspace(-1.0,1.0,50)
r=np.linspace(1.0,1.0,50)
X,Y= np.meshgrid(xlist,ylist)

Z=np.sqrt(r**2-X**2-Y**2) #Use np.sqrt like you had before

cp=ax.plot_wireframe(X,Y,Z,color="r")
cp=ax.plot_wireframe(X,Y,-Z,color="r") # Now plot the bottom half


plt.title('2D Contour Plot of The unit sphere')
plt.show()

注意

如果您希望使用这种方法使球体看起来更像一个球体,您可以增加分辨率并像这样增加rstridecstride。你也可以旋转你的轴。例如:

xlist=np.linspace(-1.0,1.0,10000)
ylist=np.linspace(-1.0,1.0,10000)
X,Y= np.meshgrid(xlist,ylist)
Z=np.sqrt(1**2-X**2-Y**2) #Note your r is redundant, use 1.

ax = plt.axes(projection="3d")

cp=ax.plot_wireframe(X,Y,Z,color="r", rstride=1000, cstride=1000)
cp=ax.plot_wireframe(X,Y,-Z,color="r", rstride=1000, cstride=1000)


plt.title('2D Contour Plot of The unit sphere')
plt.show()

【讨论】:

  • 你能解释一下为什么它错了吗?由于网格设置,默认情况下存在无效值。点 X=-1 和 Y=-1 不应具有对应于 sqrt(2)/2 半径的值,因此在给定 r=1 时为负。该值仍然隐含在计算中,这就是存在无效值的原因。如果增加网格的分辨率,球体看起来也越来越完整......
  • 是的,如果您使用scipy.sqrt 而不是np.sqrt,则该方面会更清楚地突出显示
  • 但是 OP 使用 numpy :) 。当然,Scipy 在计算复数时更准确,但在这种情况下,Nan 更适合用于绘图目的。在这种情况下,虚数不是物理的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-27
相关资源
最近更新 更多