【问题标题】:Force matplotlib to fully render plots in an IPython/Jupyter notebook cell before advancing to next cell强制 matplotlib 在推进到下一个单元之前完全渲染 IPython/Jupyter 笔记本单元中的绘图
【发布时间】:2017-04-18 13:44:05
【问题描述】:

在 IPython/Jupyter 笔记本中,我遇到类似于以下伪代码的情况:

cell 1:
run some computation
plot several plots (separate figures)

cell 2:
run some computation
plot several plots (separate figures)

这很好用,除了一个烦恼。当我依次运行两个单元格(Shift-enter、Shift-enter)时,第二个单元格中的计算在第一个单元格中的绘图被渲染之前开始运行,并且两个单元格的绘图仅在两个单元格的计算完成后才渲染.为了清楚起见,第一个单元格中的图形是在第一个单元格中的计算完成后立即创建的,但在第二个单元格中的计算也完成之前,它们一直为空。

这不会是一个大问题,除非如果第二个单元格中存在未捕获的异常,由于某种原因导致计算终止,则第一个单元格中的绘图将永远不会被渲染并且图形将保持为空。

p>

我正在寻找一种方法来在单元格 1 的末尾指示 matplotlib 或 jupyter(我不确定问题出在哪里) - 在继续执行代码之前完成所有未完成的绘图的渲染。

我正在使用 %matplotlib notebook 魔法和 matplotlib 1.5.3。

谢谢!

【问题讨论】:

    标签: python matplotlib ipython jupyter-notebook


    【解决方案1】:

    对于遇到此问题的任何人,我可以使用 matplotlib 1.5.3 和 jupyter-client 4.3 强制绘制:plt.gcf().canvas.draw()

    对于渲染多个因先前单元格中的异常而损坏的图形,我发现这可以工作:

    for fig_num in plt.get_fignums():
        plt.figure(fig_num).canvas.draw()
    

    【讨论】:

    • 使用canvas.draw() 让我获得了大部分的帮助,但是在绘制所有单元格之前没有正确设置图形的布局。这会导致部分图形一开始不可见,因为它们部分绘制在边界框之外。
    • 作为我之前评论的后续,我找到了解决该问题的方法,方法是在设置图后调用 fig.tight_layout()fig.subplots_adjust(right=0.85, bottom=0.2)。虽然您可能需要调整确切的值,但这应该填充图形的右侧和底部,以便所有内容都可见。对于问题中指定的情况,我想说为所有情节添加这两行太麻烦了。但是,在处理单元格时动态重绘图形时,该解决方法效果很好。
    猜你喜欢
    • 1970-01-01
    • 2016-02-04
    • 1970-01-01
    • 2015-10-15
    • 2015-11-11
    • 2017-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多