我目前正在学习使用Jupyter Notebook在Python中使用matplotlib
创建绘图的基本原理。我的主要抱怨是在创建子图时,为什么我必须在一个块中运行代码?每当我尝试在不同的步骤中运行它时,它会让我发现奇怪的情节。例如:
plt.subplot(211)
plt.plot(range(10))
plt.subplot(212, facecolor='y')
plt.plot(randn(50))
我必须在一个步骤中执行这四行代码,而不是分四步运行它们。这到底发生了什么?为什么两种方法之间存在这样的差异?
答案 0 :(得分:1)
在jupyter笔记本中,一旦对单元格进行评估并显示图形,您将丢失对该单元格的引用,并且该单元格中生成的图形将被关闭。
在新单元格中,当调用plt.subplot()
时,pyplot看不到任何打开的数字,因此它会创建一个新的单元格。
大多数pyplot命令的工作原理如下:找出是否有一个开放的数字(也可能是当前的轴)。如果是这种情况,请对该图(轴)进行操作,否则,创建它。这就是为什么它通常被称为statemachine;根据当前状态,做点什么。
与此相反,还有一个面向对象的API。它的工作原理是明确地调用你想要操作的对象的方法。因此,为了重用以前单元格中的图形或轴,我们将保留对它们的引用。
明确调用fig = plt.figure()
,以便fig
在下一个单元格中仍然可用。与轴相同,调用ax = fig.add_subplot(111)
以使子图在下一个单元格中可用。在任何时候,都可以调用fig
来调用图形的显示。
以下是一个例子: