【问题标题】:Draw matplotlib plot to PNG in Jupyter when inline matplotlib is enabled启用内联 matplotlib 时,在 Jupyter 中将 matplotlib 图绘制为 PNG
【发布时间】:2016-05-11 20:07:33
【问题描述】:

我正在使用类似于example here using imshow 的代码在 Jupyter 中绘制混淆矩阵热图

Matplotlib 设置为内联绘图。

这适用于输出到笔记本中的单元格,但我想输出到单元格而是获取 PNG 数据(最好是原始数据,不保存到文件中)仅限这种情况,一般情况下(一般我希望 matplotlib 内联显示)。

我不太确定该怎么做;我见过的例子似乎本质上是全局的(例如,在导入 pyplot 之前调用 matplotlib.use())。

这可能吗?怎么样?

【问题讨论】:

    标签: python matplotlib jupyter-notebook


    【解决方案1】:

    不显示内联绘图的一种简单方法是在单元格末尾使用plt.close()

    import matplotlib.pyplot as plt
    %matplotlib inline
    
    plt.plot([1,2,3],[1,2,3])
    plt.savefig("image.png")
    plt.close()
    

    【讨论】:

    • 嗯,这要简单得多!
    【解决方案2】:

    关闭交互模式:

    plt.ioff()
    

    要重新激活内嵌图像,请使用

    plt.ion()
    %matplotlib inline
    

    要将 PNG 图像保存为字节而不是文件,请将类似文件的 io.BytesIO 对象传递给 plt.savefig 而不是文件:

    import io
    data = io.BytesIO()
    plt.savefig(data)
    

    【讨论】:

    • 谢谢。这可能是我正在寻找的答案,即使它对我不起作用,因为我在容器中运行并且没有可用的 Tk,而且似乎也没有其他后端可以工作。
    • 谢谢!看起来我可以使用“pdf”或其他一些 plt.switch_backend
    • 我已经修改了我的答案——似乎没有必要先调用%matplotlib tk。因此,如果上述答案对您有用,您甚至不需要致电plt.switch_backend
    • 我会再添加几个曲线球 - 我需要将其封装在我笔记本中可调用的 API 中。所以调用 %matplotlib 魔法已经结束了。然而,这甚至有必要吗?离子/ioff 还不够吗?其次,名为 imshow 的原始示例是顶级函数,而不是方法,因此我实际上没有对象可以调用 savefig 。我希望 Figure.figimage 可以作为替代方案。将报告(如果不明显,我是使用 matplotlib 的新手)。
    • 我可以用get_ipython().enable_matplotlib('inline') 代替魔法,所以我觉得我很好。感谢所有的帮助。
    猜你喜欢
    • 1970-01-01
    • 2017-08-18
    • 1970-01-01
    • 2017-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-05
    • 2018-06-27
    相关资源
    最近更新 更多