如何在单个 IPython 笔记本中多次显示相同的 matplotlib 图?

How do I show the same matplotlib figure several times in a single IPython notebook?

我使用 IPython 笔记本和 matplotlib.pyplot,我经常创建一个需要相当大的代码块才能生成的图。然后我想保存该对象并使用完全相同的 figure/axes 对在稍后合并到另一个情节中。

例如,假设我有一些散点图的 x-y 数据对。我想显示这些点,然后再显示几个单元格——可能会调用 pyplot 来制作其他不相关的图形——我想再次显示该图形,以便我可以用回归线或一些绘制它其他图形。

在下面附上的图片中,我有一个小笔记本;我希望单元格 #2 中的图形在单元格 #3 中绘制,而无需再次调用 pyplot.scatter。

本质上,我想在不重复所有代码的情况下再次显示该图。我有什么选择可以这样做?我无法通过调用 show() 或 draw() 或将单元格中的当前图形对象设置为我保存的图形对象来完成此操作。欢迎任何建议。谢谢!

P.S。我知道,如果我重复使用图形并在其上绘制,对象将会改变,因此图形对象的状态可能与先前 IPython 单元格中绘制的图形不匹配。这对我的工作来说没问题。

Example IPython notebook

之前在单元格中分配 myFigure 后,只需在任何单元格中调用 myFigure

例如在单元格 1 中:

In [1]:
myFigure, myAx = plt.subplots()
myAx.plot([1,2,3])

在那之后的单元格中:

In [2]:
myFigure

这将显示 myFigure

假设您在 Jupyter Notebook 中使用默认的 matplotlib 后端 (%matplotlib inline)。

然后,要在笔记本中显示情节,您必须显示 图形。有 3 种方法可以做到这一点。

  1. 任何刚刚创建的非闭合图(另请参阅 this answer 以了解如何闭合图)将在单元格完成 运行ning 时自动显示。这发生在您 运行 第一个单元格时。

  2. fig(一个 matplotlib.figure.Figure 实例)放在任何单元格的末尾。

    这个方法已经在另一个现有的答案中提到了,但是注意它必须在最后一行,并且不能有尾随;。 (这对每个对象类型都是一样的。如果你执行一个内容为 1 的单元格,它将在输出中显示 1,但 1; 不会显示任何内容)

  3. 使用IPython.display.display(fig)

请注意 print(fig) 不会 起作用,因为这只会将数字的字符串表示形式发送到 sys.stdout(所以像 <Figure> 显示在笔记本中)。