Генерация PNG без DISPLAY в Python: matplotlib, networkx

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Если потребуется сохранять изображения в формате PNG, используя matplotlib, на сервере или устройстве без графического интерфейса, выберите бэкенд Agg вместо стандартного. Сделать это необходимо в начале вашего скрипта, во время загрузки matplotlib:

Python
Скопировать код
import matplotlib
matplotlib.use('Agg')  # Переход к плану Б. Отсутствует DISPLAY? Проблем не будет!

Теперь вы без препятствий сможете создавать графики и сохранять их при помощи plt.savefig('output.png'). Таким образом ваше устройство будет способно сохранять изображения без использования графического интерфейса или монитора:

Python
Скопировать код
import matplotlib.pyplot as plt
plt.plot([1, 2, 3], [4, 5, 6])
plt.savefig('output.png')  # График в безопасности и успешно сохранен!
Кинга Идем в IT: пошаговый план для смены профессии

Постоянные и динамические настройки

Если вы хотите сделать эту настройку стандартной для всех ваших скриптов, обновите запись в .matplotlibrc:

Python
Скопировать код
backend: Agg

Для расположения этого скрытого файла выполните следующую команду:

Python
Скопировать код
import matplotlib
print(matplotlib.matplotlib_fname())  # Где находится .matplotlibrc?

Для временного изменения используйте переменную среды MPLBACKEND=agg. Это возможно сделать как из терминала, так и через модуль os в Python:

Python
Скопировать код
import os
os.environ['MPLBACKEND'] = 'agg'  # Выбираем альтернативный путь

Если модуль, реализующий бэкенд, уже был импортирован, бэкенд может быть изменен на agg следующим образом:

Python
Скопировать код
import matplotlib.pyplot as plt
plt.switch_backend('agg')  # Отвлеклись? Есть возможность исправить!

Бэкенд в деталях

Бэкенд Agg работает как невидимый страж, рендерит изображения без необходимости графического окружения. Тогда как такие бэкенды, как TkAgg, Qt4Agg, и WXAgg требуют наличия графического интерфейса и не могут функционировать в его отсутствие.

Визуализация

Создание PNG-файла с использованием matplotlib в отсутствие дисплея можно сравнить с работой робота-повара 🤖🍳, который умеет готовить, руководствуясь четкими инструкциями, без помощи человека:

Markdown
Скопировать код
Без человека: 🙎❌         | Без повара: 👨‍🍳❌
Без инструкций: 👀❌       | Есть рецепт: 📝✅
Готово вкусное блюдо: 🍲✅   | Готовый превосходный график: 📊🖼️✅

Пример, как робот-повар готовит ваше блюдо:

Python
Скопировать код
import matplotlib
matplotlib.use('Agg')  # 🤖👨‍🍳: Нам не нужны люди.
import matplotlib.pyplot as plt

plt.plot([1, 2, 3])    # 🤖👨‍🍳: Смешиваем ингредиенты.
plt.savefig('plot.png') # 🤖👨‍🍳: И вуаля, ваше блюдо готово.

Выглядит просто? Тогда наденьте фартук и приступайте к творению! 🤖🍳🖼️

Автоматизированное тестирование и непрерывная интеграция

Бэкенд Agg станет вашим незаменимым атрибутом при создании графиков в контексте автоматизированного тестирования или в рамках систем непрерывной интеграции (CI). Теперь вы способны тестировать визуализации без использования X-Window, что ускорит процесс работы и даст возможность автоматической проверки графиков.

Docker, виртуальные машины и отсутствие дисплея

При задачах связанных с работой в контейнерах (например, Docker) или на виртуальных машинах, вы можете столкнуться с необходимостью работать без дисплея. Переключение на бэкенд 'Agg' решит эту проблему без лишних затруднений.

Полезные материалы

  1. Generating matplotlib graphs without a running X server – Stack Overflow — обсуждение создания графиков с использованием matplotlib без X-сервера.

  2. matplotlib.backends.backend_agg — Документация Matplotlib 3.8.2 — подробное описание бэкенда Agg.

  3. matplotlib.pyplot.savefig — Документация Matplotlib 3.8.2 — описание метода сохранения графиков без их отображения. Увидели Бэт-сигнал?

  4. matplotlib — Документация Matplotlib 3.8.2 — описание динамической смены бэкендов в matplotlib.