IPython: 如何在不同的单元格中显示相同的图表?

7

我对IPython笔记本、Jupyter和Python都还很陌生。

我正在使用以下代码在Jupyter笔记本中创建一个散点图:

import numpy as np
import matplotlib.pyplot as plt

n = 1024
X = np.random.normal(0, 1, n)
Y = np.random.normal(0, 1, n)
plt.axes([0.025, 0.025, 0.95, 0.95])
plt.scatter(X, Y, s=50)

plt.show()

我的问题是,如何获取对该绘图对象的引用,以便稍后在笔记本中的不同单元格中使用它?此外,我可能需要在再次显示之前修改绘图。
此外,在笔记本顶部有%matplotlib inline代码。
以下是我的环境信息:
- Python: 3.5.2 64bit [MSC v.1900 64 bit (AMD64)] - IPython: 4.2.0 - numpy: 1.11.1 - scipy: 0.17.1 - matplotlib: 1.5.1 - sympy: 1.0 - 操作系统:Windows 7 6.1.7601 SP1

抱歉挖出这个问题。我的解决方法是在新单元格中调用fig.savefig以保存为图像文件,并在查看器(例如EyeOfGnome)中打开图像,该查看器会自动刷新以显示当前副本。我仍然不知道如何在新的笔记本单元格中显示图形。我认为这可能与Jupyter内部有关,特别是%matplotlib inline指令。也许它会在某些后端中起作用。 - Liang
另一个解决方法是使用交互式后端:%matplotlib notebook。新的绘图命令将更新原始画布。但我认为这仍然不完全符合预期。 - Liang
2个回答

6
我找到了一个解决方案!基本上,你需要创建一个图形和坐标轴:fig,ax = plt.subplots(),然后使用ax变量来绘制(可能在多个单元格中)。在你想要重新绘制该图的任何单元格中,只需将fig写成单元格的最后一行,这将导致单元格使用更新后的图形作为输出。
更多详细信息请查看我在这里的答案。

-1

尝试使用面向对象的matplotlib接口 - matplotlib.figure; 您可以根据需要使用创建的Figure对象的引用。

  • 创建一个图形对象 - fig = plt.figure()
  • 将轴添加到它上面 - ax = fig.add_axes([0.025, 0.025, 0.95, 0.95])
  • 在创建的轴上绘制 - ax.plot(X, Y)

如果我选择这种方法,每次调用ax.scatter()都会创建一个新的“散点图”。然而,在我的笔记本中,它并没有像预期的那样工作。 - mbadawi23

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接