使用带有随机点数的matplotlib 3D绘图绘制椭圆体时出错:Python

时间:2016-05-18 09:18:40

标签: python random matplotlib plot

在使用axes3D绘制椭圆体时,我遇到了错误

TypeError:必须使用Axes3D实例作为第一个参数调用未绑定的方法plot()(改为使用ndarray实例)

我需要绘制内部随机数点的椭圆体。所以我用随机模块。但我无法确定出现这种错误的原因。该计划如下。

import random
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import *

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
n = 1000000
a = input("Enter the value of semi major axis: \n")
b = input("Enter the value of semi minor axis: \n")
c = input("Enter the value of c \n")
x = random.uniform(-a, a, n)
y = random.uniform(-b, b, n)
z = random.uniform(-c, c, n)
r = (x ** 2 / a ** 2) + (y ** 2 / b ** 2) + (z ** 2 / c ** 2)
rd = r[:] <= 1
xd = x[rd]
yd = y[rd]
zd = z[rd]
Axes3D.plot3D(xd, yd, zd, "*")
plot.show()

可能存在一些错误。我是初学者,请帮助我。

1 个答案:

答案 0 :(得分:0)

import random无法正常工作,甚至在您尝试绘制点云之前就会出现问题,因为random.uniform的签名与您使用的签名不同。

我认为您使用的真实陈述是from numpy import random ...

此外,导入3d功能的标准方式(并且有一个原因)是from mpl_toolkits.mplot3d import Axes3D - 这会修改轴对象的定义,并且这就是你所需要的。

最后,当你真正需要的是.plot()时,你使用.scatter()方法,它不会绘制连接各个点的线。

我尝试完成的内容如下(请注意,我使用修改后的ax对象,而不是Axes3D ...)

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from numpy.random import uniform

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

n, a, b, c = 2000, 10.0, 6.0, 20.0
x, y, z = [uniform(-d, d, n) for d in (a, b, c)]
inside =  ((x/a)**2 + (y/b)**2 + (z/c)**2) <= 1.0

ax.scatter(x[inside], y[inside], z[inside])

plt.show()

example plot