Генерация PNG без DISPLAY в Python: matplotlib, networkx
Быстрый ответ
Если потребуется сохранять изображения в формате PNG, используя matplotlib, на сервере или устройстве без графического интерфейса, выберите бэкенд Agg
вместо стандартного. Сделать это необходимо в начале вашего скрипта, во время загрузки matplotlib:
import matplotlib
matplotlib.use('Agg') # Переход к плану Б. Отсутствует DISPLAY? Проблем не будет!
Теперь вы без препятствий сможете создавать графики и сохранять их при помощи plt.savefig('output.png')
. Таким образом ваше устройство будет способно сохранять изображения без использования графического интерфейса или монитора:
import matplotlib.pyplot as plt
plt.plot([1, 2, 3], [4, 5, 6])
plt.savefig('output.png') # График в безопасности и успешно сохранен!
Постоянные и динамические настройки
Если вы хотите сделать эту настройку стандартной для всех ваших скриптов, обновите запись в .matplotlibrc
:
backend: Agg
Для расположения этого скрытого файла выполните следующую команду:
import matplotlib
print(matplotlib.matplotlib_fname()) # Где находится .matplotlibrc?
Для временного изменения используйте переменную среды MPLBACKEND=agg
. Это возможно сделать как из терминала, так и через модуль os в Python:
import os
os.environ['MPLBACKEND'] = 'agg' # Выбираем альтернативный путь
Если модуль, реализующий бэкенд, уже был импортирован, бэкенд может быть изменен на agg
следующим образом:
import matplotlib.pyplot as plt
plt.switch_backend('agg') # Отвлеклись? Есть возможность исправить!
Бэкенд в деталях
Бэкенд Agg
работает как невидимый страж, рендерит изображения без необходимости графического окружения. Тогда как такие бэкенды, как TkAgg
, Qt4Agg
, и WXAgg
требуют наличия графического интерфейса и не могут функционировать в его отсутствие.
Визуализация
Создание PNG-файла с использованием matplotlib в отсутствие дисплея можно сравнить с работой робота-повара 🤖🍳, который умеет готовить, руководствуясь четкими инструкциями, без помощи человека:
Без человека: 🙎❌ | Без повара: 👨🍳❌
Без инструкций: 👀❌ | Есть рецепт: 📝✅
Готово вкусное блюдо: 🍲✅ | Готовый превосходный график: 📊🖼️✅
Пример, как робот-повар готовит ваше блюдо:
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' решит эту проблему без лишних затруднений.
Полезные материалы
Generating matplotlib graphs without a running X server – Stack Overflow — обсуждение создания графиков с использованием matplotlib без X-сервера.
matplotlib.backends.backend_agg — Документация Matplotlib 3.8.2 — подробное описание бэкенда Agg.
matplotlib.pyplot.savefig — Документация Matplotlib 3.8.2 — описание метода сохранения графиков без их отображения. Увидели Бэт-сигнал?
matplotlib — Документация Matplotlib 3.8.2 — описание динамической смены бэкендов в matplotlib.