我使用matplotlib.pyplot的IPython笔记本,我经常创建一个需要相当大的代码块来生成的图。然后,我想保存对象并使用完全相同的图形/轴对,以便稍后合并到另一个图中。
例如,假设我有一些散射图的x-y数据对。我想显示点数,然后是几个单元格 - 可能还有其他调用pyplot来制作其他无关的数字 - 我想再次显示这个数字,以便我可以用回归线绘制它或其他一些图形。
在下面我附上的图片中,我有一个简短的笔记本;我希望单元格#2中的数字在单元格#3中绘制而不再调用pyplot.scatter。
基本上,我希望在不重复所有代码的情况下再次显示该图。这样做有什么选择?我无法通过调用show()或draw()或通过将单元格中的当前图形对象设置为我保存的图形对象来完成此操作。欢迎任何建议。谢谢!
P.S。我知道如果我重复使用图形并在其上绘图,则对象将发生变化,因此图形对象的状态可能与先前IPython单元格中绘制的绘图不匹配。这对我的工作没问题。
答案 0 :(得分:12)
在之前的单元格中myFigure
分配myFigure
之后,只需在任何单元格中调用In [1]:
myFigure, myAx = plt.subplots()
myAx.plot([1,2,3])
。
例如在单元格1中:
In [2]:
myFigure
之后的单元格:
myFigure
这将显示realloc
答案 1 :(得分:3)
假设您在 Jupyter Notebook 中使用默认的 matplotlib 后端 (%matplotlib inline
)。
然后,要在笔记本中显示绘图,您必须显示图形。有 3 种方法可以做到这一点。
任何刚刚创建的非闭合图(另请参阅 this answer 了解如何关闭图)将在单元格运行结束时自动显示。这发生在您运行第一个单元格时。
将 fig
(一个 matplotlib.figure.Figure
实例)放在任何单元格的末尾。
此方法已在其他现有答案中提及,但请注意它必须在最后一行,并且不得有尾随 ;
。 (这对于每个对象类型都是一样的。如果您执行内容为 1
的单元格,它将在输出中显示 1
,但 1;
不会显示任何内容)
请注意,print(fig)
将不起作用,因为这只会将图形的字符串表示发送到 sys.stdout
(因此类似 <Figure>
的内容显示在笔记本)。