2016-05-18 14 views
0

Während eines Ellipsoid mit axes3D Plotten, traf ich mit einem FehlerFehler beim einem Ellipsoid mit matplotlib 3D-Plot mit Zufallszahl von Punkten Plotten innen: Python

Typeerror: ungebundene Methode Grundstück() muss mit Axes3D Instanz aufgerufen werden als erstes Argument (NDarray-Instanz stattdessen)

Ich muss das Ellipsoid mit zufälliger Anzahl von Punkten im Inneren plotten. SO habe ich ein zufälliges Modul benutzt. Aber ich konnte den Grund für einen solchen Fehler nicht identifizieren. Das Programm ist unten angegeben.

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() 

Kann es einige Fehler geben. Ich bin ein Anfänger und bitte hilf mir.

+0

bitte Ihren aktuellen Code veröffentlichen, was du gepostet hast, scheitert an 'random.uniform (-a, a, n)' – gboffi

+0

Der Fehler sagt dir genau, was zu tun ist (nicht, dass dies das einzige Problem ist). Verwenden Sie einfach ax als ersten Parameter in plot3d! – sascha

Antwort

0

Ihre import random kann nicht funktionieren, was zu Problemen führt, noch bevor Sie versuchen, Ihre Punktwolke zu plotten, weil random.uniform eine andere Signatur als das, was Sie verwenden, hat.

Ich nehme an, dass die eigentliche Aussage, die Sie from numpy import random verwenden ist ...

Ferner ist die Standardmethode (und es gibt einen Grund) ist die 3D-Fähigkeiten zu importieren from mpl_toolkits.mplot3d import Axes3D - dies die Definition der Achsen ändert Objekt, und das ist alles was du brauchst.

Schließlich verwenden Sie die Methode .plot(), wenn Sie wirklich .scatter() benötigen, die nicht die Linien zeichnet, die die einzelnen Punkte verbinden.

Meine Version von dem, was Sie versuchen zu erreichen ist wie folgt (man beachte, dass ich das modifizierte ax-Objekt verwenden, nicht 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

+0

Danke @gboffi. Das funktioniert wirklich !! –

+0

@AthulRT Ich bin froh, Ihr positives Feedback zu hören - ich frage mich, ob es möglich wäre, dass Sie meine Antwort formell annehmen ... – gboffi

+0

Entschuldigung, dass Sie zu spät kommen. –

Verwandte Themen