Включить вывод из% matplotlib backend в качестве SVG в ipynb

Этот ответ от нескольких лет назад показывает, как вы можете сделать jupyter notebook создавать графики как svg. Решение состоит в том, чтобы сообщить InlineBackend использовать svg как вывод.

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

Это приведет к тому, что все изображения будут в формате svg внутри ноутбука, а также в созданном файле ipynb; файл будет иметь строку типа

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

в нем.

Проблема в том, что это не работает, если используется бэкэнд %matplotlib notebook. %config InlineBackend ничего не изменяет для backend ноутбука, поэтому выходной файл содержит изображение PNG

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

Итак, вопрос: Как заставить ipynb файл включать статическую версию графика, созданного с помощью %matplotlib notebook backend в качестве изображения 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 или dataframes.

+8
02 авг. '17 в 17:04
источник поделиться
2 ответа

Поскольку, по-видимому, даже после периода щедрости никто не смог обеспечить решение, обходным путем может быть следующее.

  • Создайте ноутбук с помощью %matplotlib notebook. После того, как вы удовлетворены результатом, сохраните его.
  • Используйте его копию и замените %matplotlib notebook на

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

    Перезагрузите ноутбук. Сохраните результат.

  • Откройте полученный файл ipynb в текстовом редакторе и снова замените предыдущие две строки на %matplotlib notebook.

Конечным результатом будет ipynb с изображениями svg. Но после его открытия и запуска он будет использовать бэкэнд для создания рисунков.

+1
15 авг. '17 в 14:20
источник

Из того, что я понимаю из чтения о бэкендах matplotlib, nbagg, который вызывается с использованием %matplotlib notebook, использует рендеринг Agg (Anti-Grain Geometry), который не способен отображать векторную графику. К сожалению, это единственный в своем роде способ использования встроенного бэкэнда interactive для Jupyter.

Docs Link https://matplotlib.org/faq/usage_faq.html#what-is-interactive-mode
Похожие ответы Как сделать matplotlibs nbagg backend генерировать 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'))

затем

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
13 авг. '17 в 20:41
источник

Посмотрите другие вопросы по меткам или Задайте вопрос