3. Магические команды matplotlib

Я предполагаю, что вы так же как и я, работаете в дистрибутиве Python Anaconda и используете IPython в оболочке Jupyter Notebook. Если это так, то начнем мы с магических команд. Дело в том, что matplotlib может выводить графики на экран разными способами (использовать различные backend-ы). Для начала проверим версию библиотеки и backend, который используется по умолчанию. Создайте новый блокнот и выполните в первой ячейке следующий код:

import matplotlib
print(matplotlib.__version__)
print(matplotlib.get_backend())
3.0.0
module://ipykernel.pylab.backend_inline

Если вы работаете в интерактивном режиме Python или IPython, то используемым backendom скорее всего окажется Tk или Qt. Но если мы работаем в Jupyter, то нам нужен backend способный работать с браузером, т.е. основанный на javascript.

Что бы выбрать backend можно воспользоваться командой matplotlib.use("backend_name"). Backend, который необходим для работы в Jupyter называется nbagg:

matplotlib.use('nbagg')
print(matplotlib.get_backend())
nbAgg

Нужно сразу заметить, что такое подключение backend-а необходимо выполнять перед командой import matplotlib.pyplot as plt.

Установить backend можно так же с помощью магических команд IPython: %matplotlib backend_name. Для следующих экспериментов перезапустим ядро (Kernel -> Restart) и попробуем выполнить следующий код без всяких установок backend-а и магических команд:

import matplotlib.pyplot as plt
plt.plot([0, 1, 2, 3], [0, 3, 1, 2])
plt.show()

Все что вы увидите:

<matplotlib.figure.Figure at 0xb3ca682c>

Никакого графика нет. Тем не менее matplotlib создал объект графика и его осталось только отобразить, точнее осталось указать чем именно этот график должен отображаться.

Давайте добавим в начало кода магическую команду:

%matplotlib
import matplotlib.pyplot as plt
plt.plot([0, 1, 2, 3], [0, 3, 1, 2])
plt.show()

В результате появится сообщение:

Using matplotlib backend: Qt5Agg

В сообщении говорится, что используется backend Qt, и, действительно появилось новое окошко с графиком:

Магическая команда matplotlib для Qt

У такого способа построения графики есть целый ряд преимуществ, например, интерактивность. Однако, построение интерактивной графики, возможно и с помощью %matplotlib notebook. Давайте изменим первую строчку в нашем коде и посмотрим, что получится:

%matplotlib notebook
import matplotlib.pyplot as plt
plt.plot([0, 1, 2, 3], [0, 3, 1, 2])
plt.show()

Как видите, график появился не в отдельном окне, а прямо внутри вашего блокнота, при этом он так же интерактивен.

Магическая команда matplotlib для интерактивного режима в блокноте Jupyter

Если в других ячейках выполнить код, который строит графики, то они появятся в той же области. Выполните следующий код в ячейке ниже и убедитесь в этом:

plt.plot([0, 1, 2, 3], [2, 1, 3, 0])
plt.show()

Магическая команда matplotlib для интерактивного режима в блокноте Jupyter отображает все линии на одной области

В таком интерактивном режиме, график моментально реагирует на все изменения в данных, что очень похоже на интерактивный режим самого языка Python. Давайте двинемся дальше и рассмотрим еще одну магическую команду.

Снова немного изменим наш код:

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

После выполнения данной команды, график будет построен прямо в браузере под ячейкой в которой выполнен код. Команда %matplotlib inline указывает, что график необходимо построить все в той же оболочке Jupyter, но теперь он выводится как обычная картинка. Данный способ удобен тем, что позволяет проводить очень много экспериментов в рамках одного окна (точнее web-страницы). В этом статическом режиме, никакие изменения не отобразятся до тех пор пока не будет выполнена команда plt.show()Именно этой магической командой мы и будем пользоваться в дальнейшем. Но не забывайте, два предыдущих способа вывода графиков могут так же оказаться весьма полезны.

Кстати, магические команды, так же как и команды импорта библиотек, распространяются на весь блокнот (и все его ячейки), поэтому, команды: %matplotlib, %matplotlib notebook и %matplotlib inline достаточно указывать один раз в самой первой ячейке. Целесообразнее всего именно так и поступить - указать в первой ячейке команду %matplotlib inline и больше не вводить ее. Ну а я, для особо нетерпеливых новичков, которые читают с середины, буду указывать эту команду в каждом примере.