Использование ноутбука% matplotlib после того, как% matplotlib inline в Jupyter Notebook не работает

Я использую Jupyter Notebook для построения рисунков пикчарта.

В первой ячейке с моим кодом у меня есть волшебная команда %matplotlib inline, и после этой магической команды я запускаю свой код, все работает отлично, и моя фигура отображает.

Но в второй ячейке, когда я устанавливал %matplotlib notebook для интерактивного построения графика, моя фигура не будет отображаться после запуска этой второй ячейки.

Мне нужно перезапустить ядро ​​и снова запустить ячейку с помощью %matplotlib notebook и не запускать команду %matplotlib inline до этого.

Вот мой код для первой ячейки с %matplotlib inline, который делает штраф:

import matplotlib.pyplot as plt

%matplotlib inline

labels = "No", "Yes"
sizes = [100, 50]

fig, ax = plt.subplots(figsize=(6, 6))

_, texts, autotexts = ax.pie(sizes, explode=explode, labels=labels, colors=colors, autopct='%1.1f%%',
             shadow=False, startangle=90)

ax.axis('equal')

После этого у меня есть вторая ячейка с тем же кодом, только %matplotlib inline изменяется на %matplotlib notebook. Рисунок не будет отображаться после запуска этой ячейки, и мне нужно перезапустить ядро ​​и снова запустить эту ячейку.

Почему?

Ответ 1

У вас просто неправильный порядок ваших команд. Бэкэнд должен быть установлен перед импортом pyplot в jupyter. Или, другими словами, после смены бэкэнда pyplot необходимо снова импортировать.

Поэтому вызовите %matplotlib... до импорта pyplot.

В первой ячейке:

%matplotlib inline
import matplotlib.pyplot as plt
plt.plot([1,1.6,3])

Во второй ячейке:

%matplotlib notebook
#calling it a second time may prevent some graphics errors
%matplotlib notebook  
import matplotlib.pyplot as plt
plt.plot([1,1.6,3])

enter image description here

Ответ 2

Изменить: оказывается, что вы действительно можете динамически изменять backend на jupyter. Все еще оставляя ответ здесь, потому что я думаю, что это актуально и объясняет некоторую магию matplotlib, которая иногда может выскакивать.

Магическая команда, как показано в исходный код, вызывает matplotlib.pyplot.switch_backend(newbackend), чтобы изменить бэкэнд. Как указано в matplotlib docs:

matplotlib.pyplot.switch_backend (newbackend)

Переключите бэкэнд по умолчанию. Эта функция является экспериментальной, и ожидается, что она будет работать, переключаясь на бэкэнд изображения. например, если у вас есть куча скриптов PostScript, которые вы хотите запустить из интерактивного сеанса ipython, вы можете переключиться на базовую часть PS, прежде чем запускать их, чтобы избежать появления кучи всплывающих окон графического интерфейса. Если вы попытаетесь в интерактивном режиме переключиться с одного GUI-сервера на другой, вы взорветесь.

Таким образом, вы действительно должны перезапускать ядро ​​каждый раз, когда вы переключаете серверы, потому что matplotlib имеет проблему для переключения бэкэнд после использования.

Эта проблема в основном связана с несовместимостью между различными основными контурами GUI-сервера. Поскольку обычно каждый бэкэнд также заботится о потоках и пользовательском вводе, вы не можете запускать Qt и Tkinter бок о бок. Таким образом, ограничение переносится на jupyter.

Также см. этот вопрос: Как включить backend в matplotlib/Python

Ответ 3

В блокноте Jupyter вы должны указать блокнот matplotlib в той же строке, что и тот, который хотите запустить. Даже если вы введете "встроенный", а затем "блокнот", он все равно не будет работать. Он должен быть в той же строке, что и код, который вы хотите отобразить.