我对matplotlib - pyplot教程有疑问,链接是here 我是荷兰语的本地人,可以阅读标准英语。 我的问题不是关于一个不起作用的例子,而是关于文本。 在pyplot_tutorial章节中,使用多个数字和轴,它们使用有状态和有状态的单词。我不明白他们的意思。我们在荷兰语中没有一句话。我在互联网上搜索,但我没有找到任何东西。我认为有状态意味着使用所有可能性完成。
我希望有人对我有答案。 我知道这不是一个问题,因为它不是关于编程,但我不知道在哪里可以提出它。
答案 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])
这些步骤执行相同的步骤:
matplotlib.figure.Figure
)matplotlib.axes.AxesSubplot
)并将其添加到图中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
的有状态界面的一点是它经常与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)
在这种情况下,状态类似于记忆。
你可以用类比来思考它:
一个无国籍人从一项任务到另一项任务都没有记忆。
有状态的人有记忆/记录他们从一项任务到下一项任务的生活。
在您的情况下,无状态意味着绘制值而不参考过去的值。
通过有状态,库会跟踪或记住绘制的过去值。
这可以避免过多的内存消耗和进程开销。