将%matplotlib笔记本后端的输出包含在ipynb中作为SVG

时间:2017-08-02 17:04:09

标签: python pandas matplotlib jupyter-notebook

几年前的

This回答显示了如何让jupyter笔记本创建图形为svg。解决方案是告诉InlineBackend使用svg作为输出。

import matplotlib.pyplot as plt
%matplotlib inline
%config InlineBackend.figure_format = 'svg'
plt.plot(...)

这将导致所有图像在笔记本内以及生成的ipynb文件中以svg格式显示;该文件将有一行像

"data": {  "image/svg+xml": [  "<?xml  .....

在其中。

现在的问题是,如果使用%matplotlib notebook后端,这不起作用。 %config InlineBackend不会更改笔记本后端的任何内容,因此输出文件包含PNG图像

"data": { "text/html": [  "<img src=\"data:image/png;base64,iVBORw0....

所以问题是:如何让ipynb文件包含使用%matplotlib notebook后端创建的SVG图像的静态版本?

一个月前@mark jay有一个小评论,他想做我现在想做的事情,但是没有回答或提示。

在我的代码中,我直接从数据框绘制:

%matplotlib notebook
import pandas as pd
df = pd.read_sql(sql1, connection)
...
...
df.plot(subplots=True, kind='bar')

如果不导入matplotlib.pyplot,它的功能非常好,但也无法强制将图形创建为svg。我想如果基本情况可行,我可以修改绘图代码,因此它不涉及pandas或数据帧。

2 个答案:

答案 0 :(得分:1)

根据我对阅读有关matplotlib后端的理解,使用%matplotlib notebook调用的nbagg使用不能渲染矢量图形的Agg(反粒几何)渲染。不幸的是,这是为Jupyter使用交互式内联后端的唯一开箱即用方式。

文档链接https://matplotlib.org/faq/usage_faq.html#what-is-interactive-mode
类似答案How to make matplotlibs nbagg backend generate SVGs?

如果您不需要交互性,请继续使用

import pandas as pd
from IPython.display import SVG, display
from numpy import ndarray

def svg_add(chart, size=(4,4), dpi=100):
    """Takes a chart, optional tuple of ints for size, int for dpi
    default is 4 by 4 inches with 100 dpi"""

    if type(chart) == ndarray:
        fig = chart[0].get_figure()
        fig.set_size_inches(size)
        fig.savefig("mybar.svg", dpi=dpi)
        display(SVG(filename='mybar.svg'))
    else:
        fig = chart.get_figure()
        fig.set_size_inches(size)
        fig.savefig("mybar.svg", dpi=dpi)
        display(SVG(filename='mybar.svg'))

然后

df = pd.DataFrame([[2,5]],columns=['a','b'])
bar_chart = df.plot(subplots=False, kind='bar')
svg_add(chart=bar_chart,size=(3,3),dpi=100)
#or
#svg_add(bar_chart,(3,3),100)

答案 1 :(得分:1)

由于显然即使在赏金期之后,没有人能够提供解决方案,但解决方法可能如下:

  1. 使用%matplotlib notebook创建笔记本。一旦您对结果感到满意,请保存。
  2. 使用它的副本并将%matplotlib notebook替换为

    %matplotlib inline
    %config InlineBackend.figure_format = 'svg'
    

    重新运行完整的笔记本。保存结果。

  3. 在文本编辑器中打开生成的ipynb文件,并使用%matplotlib notebook再次替换前两行。
  4. 最终结果将是带有svg图像的ipynb。但是一旦打开并运行,它将使用笔记本后端来创建数字。