2014-07-15 54 views
0

我有一个关于matplotlib的问题 - pyplot教程,链接是here 我是一个本土的荷兰语演讲者,可以阅读标准的英语。 我的问题不是关于不起作用的例子,而是关于文本。 在pyplot_tutorial章节中,使用多个图形和轴,它们使用有状态和有状态的单词。我不明白他们的意思。我们在荷兰没有一个词。我在互联网上搜索过,但我没有找到任何东西。我认为这种有状态意味着完整的,使用所有的可能性。当他们说'有状态'时,这意味着什么?

我希望有人对我有一个答案。 我知道这不是一个问题,因为它不是关于编程,而是我不知道还有什么要问的。

+0

这里有一个很好的解释[这里](http://en.wikipedia.org/wiki/State_(computer_science))。除了CS /编程世界之外,我还没有看到在英语中任何其他地方使用过的词。也许有人在[english.se]会更好... – ElGavilan

+4

这是matplotlib记住你绘制的数字。除非你说'plt.close()'你先前绘制的数字仍然在记忆中。这并不是一个大问题,当你绘制一些图像时,但是当运行一个循环和绘制很多图像时,它会消耗大量的内存 – ThePredator

+0

我不知道matplotlib,但通常状态意味着某种状态被记录,一种当前'会话'隐含的上下文。我通常了解有状态与无状态相反,在每个调用/使用中,由于不存在,您必须提供完整的上下文。这是一个快速的评论,如果你可以附上pyplot教程的url来确认。 –

回答

0

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

可以使用一个比喻想起来了:

  • 无国籍人具有从一个任务到下一个没有自己的生活记忆。

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

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

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

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

5

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

首先有状态例如:

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

在面向对象的形式,我们做上述操作相当明确,并采取对象引用变量(fig,ax,li)。引用在有状态接口中也不会丢失,但它们隐藏在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有状态接口的一点是它经常与在IPython中运行的pylab一起使用。这提供了有状态接口以及一些带有命名空间的快捷方式。绘制正弦曲线一样简单:

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,但是我在面向对象的表单中显示了我的matplotlib相关答案中的几乎所有示例,因为它更透明。

相关问题