car*_*mom 10 python matplotlib pandas jupyter-notebook
这从几年前的回答显示了如何做jupyter笔记本创建图形为SVG.解决方案是告诉InlineBackend使用svg输出.
import matplotlib.pyplot as plt
%matplotlib inline
%config InlineBackend.figure_format = 'svg'
plt.plot(...)
Run Code Online (Sandbox Code Playgroud)
这将导致所有图像在笔记本内部以及生成的ipynb文件中以svg格式显示; 该文件将有一行像
"data": { "image/svg+xml": [ "<?xml .....
Run Code Online (Sandbox Code Playgroud)
在里面.
问题是,如果使用%matplotlib notebook后端,这不起作用.%config InlineBackend不会更改笔记本后端的任何内容,因此输出文件包含PNG图像
"data": { "text/html": [ "<img src=\"data:image/png;base64,iVBORw0....
Run Code Online (Sandbox Code Playgroud)
所以问题是:如何让ipynb文件包含使用%matplotlib notebook后端创建的SVG图像的静态版本?
@mark jay从一个月前发表了一个小评论,他想做我现在想做的事情,但没有回答或暗示这个评论.
在我的代码中,我直接从数据框绘制:
%matplotlib notebook
import pandas as pd
df = pd.read_sql(sql1, connection)
...
...
df.plot(subplots=True, kind='bar')
Run Code Online (Sandbox Code Playgroud)
这个功能非常好,无需导入,matplotlib.pyplot但也无法强制将图形创建为svg.我想如果基本情况可行,我可以修改绘图代码,因此它不涉及pandas或数据帧.
根据我从有关 matplotlib 后端的阅读中了解到的信息,nbagg(称为 using)%matplotlib notebook使用 Agg(反颗粒几何)渲染,它无法渲染矢量图形。不幸的是,这是使用Jupyter交互式内联后端的唯一开箱即用的方式。
文档链接https://matplotlib.org/faq/usage_faq.html#what-is-interactive-mode
类似答案如何使 matplotlibs nbagg 后端生成 SVG?
如果您不需要交互性,请继续使用
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'))
Run Code Online (Sandbox Code Playgroud)
然后
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)
Run Code Online (Sandbox Code Playgroud)