当他们说'有状态'时,这是什么意思?

时间:2014-07-15 17:53:33

标签: python matplotlib

我对matplotlib - pyplot教程有疑问,链接是here 我是荷兰语的本地人,可以阅读标准英语。 我的问题不是关于一个不起作用的例子,而是关于文本。 在pyplot_tutorial章节中,使用多个数字和轴,它们使用有状态和有状态的单词。我不明白他们的意思。我们在荷兰语中没有一句话。我在互联网上搜索,但我没有找到任何东西。我认为有状态意味着使用所有可能性完成。

我希望有人对我有答案。 我知道这不是一个问题,因为它不是关于编程,但我不知道在哪里可以提出它。

2 个答案:

答案 0 :(得分:12)

在这种情况下,通过简单的绘图示例可能最好地理解差异。

首先是有状态的例子:

import matplotlib.pyplot as plt

plt.figure()
plt.plot([0,1], [1,0])

然后是无状态(或者说面向对象的方法):

import matplotlib.pyplot as plt

fig = plt.figure()
ax = fig.add_subplot(111)
li = ax.plot([0,1], [1,0])

这些步骤执行相同的步骤:

  1. 创建一个图形对象(matplotlib.figure.Figure
  2. 创建一个新的绘图区域对象(matplotlib.axes.AxesSubplot)并将其添加到图中
  3. 在绘图区域(matplotlib.lines.Line2D
  4. 中创建一个新行

    在面向对象的表单中,我们相当明确地执行上面的操作,并将对象引用转换为变量(figaxli)。引用也不会在有状态接口中丢失,但它们隐藏在matplotlib内的某处。

    当我们尝试更改某些属性(例如,图的大小。使用OO方法:

    fig.set_size_inches([10, 8])
    

    通过有状态的方法,我们首先需要找到这个数字。有一个功能; plt.gcf。所以:

    plt.gcf().set_size_inches([10,8])
    

    几乎是一回事。几乎'在我们同时打开多个数字的情况下,部分变得非常重要。 plt.gcf会返回当前的'虽然如此,但很难说出哪一个是现在的。

    相同的情况与轴或线重复。如果我们想调整图的x刻度,那么:

    ax.set_xticks([0,.5,1])
    

    非常简单。有状态的方法就变成了:

    plt.gca().set_xticks([0, .5, 1])
    

    其中gca()返回'当前'轴。如果你有几个子图,这就变得非常复杂了。

    所以,问题是谁持有这些物品。有状态接口只是面向对象信息的一个薄包装器。所有参数都在对象中,并且在一个图中有许多对象(数百甚至数千)。

    matplotlib的有状态界面的一点是它经常与pylab中运行的IPython一起使用。这给出了有状态接口以及一些带有命名空间的快捷方式。绘制正弦曲线非常简单:

    x = linspace(0, 2*pi, 100)
    plot(x, sin(x))
    

    这可以说比以下更简单:

    import numpy as np
    import matplotlib.pyplot as plt
    
    x = np.linspace(0, 2*np.pi, 100)
    fig = plt.figure()
    ax = fig.add_subplot(111)
    li = ax.plot(x, np.sin(x))
    

    虽然pylab提供的快捷方式对于交互式工作非常方便,但它在脚本中并不好用。我也使用pylab,但是我以{eobject-oriented形式显示我的matplotlib相关答案中的几乎所有示例,因为它更加透明。

答案 1 :(得分:0)

在这种情况下,状态类似于记忆。

你可以用类比来思考它:

  • 一个无国籍人从一项任务到另一项任务都没有记忆。

  • 有状态的人有记忆/记录他们从一项任务到下一项任务的生活。

在您的情况下,无状态意味着绘制值而不参考过去的值。

通过有状态,库会跟踪或记住绘制的过去值。

这可以避免过多的内存消耗和进程开销。