2016-05-18 1 views
0

axes3Dを使用して楕円をプロットしている間、私はエラーで満たさはTypeErrorエラー:パイソン

:非結合方法プロットは()Axes3Dインスタンスに呼び出されなければなりません最初の引数として(代わりに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() 

いくつかのエラーがある場合があります。私は初心者で、私を助けてください。

+0

あなたの実際のコードを投稿してください、あなたが投稿したものは 'random.uniform(-a、a、n)'に失敗します。 – gboffi

+0

エラーはあなたに何をするかを正確に伝えています(これは唯一の問題ではありません)。 plot3dの最初のパラメータとしてaxを使用してください! – sascha

答えて

0

import randomは機能しません。random.uniformは使用しているシグネチャとは異なるため、ポイントクラウドをプロットしようとする前でも問題が発生します。

私はさらに

...あなたが使用して実際の文がfrom numpy import randomであると仮定し、3D機能をインポートする標準的な方法は、(と理由がある)from mpl_toolkits.mplot3d import Axes3Dである - これは、Axesオブジェクトの定義を変更し、それはあなたが必要なすべてです。

最後に、実際に必要なものが.scatter()で、個々のポイントを結ぶ線を描画しない場合は、.plot()メソッドを使用します。

次のようにあなたが達成しようとしているものの私のバージョンがある(ないAxes3D、私は変更さaxオブジェクトを使用することに注意してください...)

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

+0

ありがとう@gboffi。それは本当に動作します! –

+0

@AthulRTあなたの肯定的なフィードバックを聞いてうれしいです - 正式に私の答えを受け入れることが可能かどうか疑問に思っています。 – gboffi

+0

ごめんなさい。 –