将球形脚本包含在类

时间:2017-08-23 03:13:46

标签: python class matplotlib 3d

我正在尝试在类中包含此脚本。这是为了了解类如何工作以及使函数在其他地方可用。

此脚本在3D matplotlib中创建一个球体。球的方程是x ^ 2 + y ^ 2 + z ^ 2 = r ^ 2。如果我们将系数添加到任何变量,它会将球体拉长或缩短为椭圆。我希望能够调用这个类并改变r(半径)值和一些系数。

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

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

# CREATE EMPTY LISTS
xs = []
ys = []
zs = []

# FOR EACH Z PLANE "z=dd", 
# CREATE CIRCLE WITH RADIUS ppp "ppp=100-dd^2"
def generateZ(dd):
    ppp = 100 - dd**2
    for xxx in range(-10,10):
        zs.append(dd)
        xs.append(xxx)
        yyy = np.sqrt(ppp - xxx**2)
        ys.append(yyy)
    for xxx in range(-10,10):
        zs.append(dd)
        xs.append(xxx)
        yyy = -np.sqrt(ppp - xxx**2)
        ys.append(yyy)

# GENERATE X AND Y'S FOR EACH Z
for dd in range(-10,10):
    generateZ(dd)

# SCATTER X,Y, AND Z COORDINATES
ax.scatter(xs, ys, zs)

# LABEL AXES
ax.set_xlabel("x axis")
ax.set_ylabel("y axis")
ax.set_zlabel("z axis")

# SET DIMENSIONS OF GRAPH
ax.set_ylim([-12,12])
ax.set_xlim([12,-12])
ax.set_zlim([-12,12])
# SHOW GRAPH
plt.show()

我只是尝试添加类容器并调用它。结果是自我没有被定义......

这是尝试。

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

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

class Sphere(object):

    def __init__(self):
        self.xs = []
        self.ys = []
        self.zs = []

    # CREATE EMPTY LISTS


    # FOR EACH Z PLANE "z=dd", 
    # CREATE CIRCLE WITH RADIUS ppp "ppp=100-dd^2"
    def generateZ(self, dd):
        self.ppp = 100 - dd**2
        for xxx in range(-10,10):
            self.zs.append(dd)
            self.xs.append(xxx)
            self.yyy = np.sqrt(ppp - xxx**2)
            self.ys.append(yyy)
        for xxx in range(-10,10):
            self.zs.append(dd)
            self.xs.append(xxx)
            self.yyy = -np.sqrt(ppp - xxx**2)
            self.ys.append(yyy)

    # GENERATE X AND Y'S FOR EACH Z
    for dd in range(-10,10):
        self.generateZ(dd)

    # SCATTER X,Y, AND Z COORDINATES
    self.ax.scatter(xs, ys, zs)

    # LABEL AXES
    self.ax.set_xlabel("x axis")
    self.ax.set_ylabel("y axis")
    self.ax.set_zlabel("z axis")

    # SET DIMENSIONS OF GRAPH
    self.ax.set_ylim([-12,12])
    self.ax.set_xlim([12,-12])
    self.ax.set_zlim([-12,12])

    # SHOW GRAPH
    self.plt.show()

john = Sphere.generateZ(10)

1 个答案:

答案 0 :(得分:1)

使用类或函数时,保持缩进一致至关重要。在示例代码中,缩进是错误的。

如果我们纠正这个问题,那么剩下的问题是该类未初始化。解释我们不需要matplotlib或任何复杂的代码。 考虑以下课程。

class Foo(object):
    def __init__(self, arg):
        self.arg = arg

    @staticmethod    
    def mystaticmethod(arg):
        print(arg)

    def mymethod(self, arg):
        print(arg)
        print(self.arg)

它有一个__init__方法和另外两种方法。一种是静态方法,另一种是常规方法。由于静态方法不依赖于实例化的类,因此可以将其称为

Foo.mystaticmethod(3)

但是,如果您对mymethod

尝试相同的操作
Foo.mymethod(3)

它将失败,因为该类尚未实例化,即没有Foo的实例self。要使用此方法,首先需要该类的实例。

Foo(4).mymethod(3)

我会留给你把这个概念翻译成你的班级。