【问题标题】:Creating subplots with matplotlib使用 matplotlib 创建子图
【发布时间】:2017-08-26 12:29:33
【问题描述】:

我目前正在学习使用 Jupyter Notebook 在 Python 中使用 matplotlib 制作绘图的基本理念。我的主要抱怨是在创建子图时,为什么我必须在一个块中运行代码?每当我尝试以单独的步骤运行它时,它都会给我带来奇怪的情节。例如:

plt.subplot(211)

plt.plot(range(10))

plt.subplot(212, facecolor='y')

plt.plot(randn(50))

我必须一步执行这四行代码,而不是四步运行它们。这里到底发生了什么?为什么这两种方法有这么大的区别?

【问题讨论】:

  • 请注意,有一个微妙的替代方案称为plt.subplots()(带有“s”)。这种方法与经典的 matlab 风格有点不同,它允许您在一行中声明图形和轴元组,例如fig, (ax1, ax2) = plt.subplots(1, 2, sharey=True)。可以随时为这些轴分配新数据。
  • @pylang 重点不在于是使用plt.subplot 还是使用plt.subplots 创建子图。关键是使用状态机还是使用oo api,即是否保留对对象的引用。
  • 也许我应该说得更清楚一些。我打算做的是启动一个子图并在其上绘制,然后启动另一个子图并在其上制作另一个图,依此类推。问题是我必须在一个单元格中执行这些步骤(而不是在一个单独的单元格中)才能获得预期的效果。为什么我不能一步一步地制作几个子图,以便能够检查每个中间结果的样子?
  • 不,add_subplots 不会修改任何位置。它只是在网格上的给定位置添加一个子图。无论如何,我认为要点已经传达:只要您跟踪对象句柄,您就可以在任何您喜欢的单元格中做任何您喜欢的事情。

标签: python matplotlib plot jupyter-notebook figure


【解决方案1】:

在 jupyter 笔记本中,一旦对单元格进行评估并显示图形,您将失去对它的引用,并且在该单元格中生成的图形将关闭。
在新单元格中,调用plt.subplot() 时,pyplot 没有看到任何打开的图,因此它创建了一个新图。

大多数 pyplot 命令的工作方式是这样的:找出是否有一个开放的图形(也可能是当前的轴)。如果是这种情况,请对该图形(轴)进行操作,如果不是,请创建它。这就是为什么它经常被称为状态机。根据当前状态,做点什么。

与之相反,还有一个面向对象的 API。它通过显式调用您要操作的对象的方法来工作。因此,为了重用以前单元格中的图形或轴,我们将保留对它们的引用。

显式调用fig = plt.figure(),这样fig 在下一个单元格中仍然可用。与轴相同,调用ax = fig.add_subplot(111) 以使子图在下一个单元格中可用。在任何时候,调用fig 来调用图形的显示。

这是一个例子:

【讨论】:

  • 非常感谢。这正是我正在寻找的。不过,“无记忆”的东西对我来说似乎并不是很直观。
猜你喜欢
  • 2017-10-20
  • 1970-01-01
  • 1970-01-01
  • 2022-07-07
  • 2021-02-22
  • 1970-01-01
  • 1970-01-01
  • 2020-05-05
  • 2017-10-22
相关资源
最近更新 更多