Решение проблемы с пустыми изображениями в matplotlib

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

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

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

Для предотвращения создания пустых файлов изображений при использовании команды plt.savefig('output.png'), следует сохранять график до его отображения на экране с помощью plt.show(). В противном случае, все элементы графика, отрисованные после plt.show(), не будут сохранены в файле.

Python
Скопировать код
import matplotlib.pyplot as plt

plt.plot([1, 2, 3], [4, 5, 6])
plt.savefig('output.png')  # Сначала сохраняем
plt.show()  # Затем отображаем
Кинга Идем в IT: пошаговый план для смены профессии

Переключение между графиками с помощью plt.gcf()

При работе с несколькими графиками команда plt.gcf() помогает ориентироваться. Она устанавливает на текущий график фокус, позволяя сосредоточиться на нём.

Python
Скопировать код
fig = plt.figure()
plt.plot([1, 2, 3], [4, 5, 6])
fig.savefig('current_figure.png')  # Сохраняем текущий график

Управление субплотами

Функция plt.subplots() облегчает управление позицией и размером субплотов на графике.

Python
Скопировать код
fig, ax = plt.subplots(nrows=2, ncols=2)
# Далее отрисовываем на созданных осях...
fig.savefig('subplots_figure.png')

Количество точек на дюйм

Для создания изображений высокого качества рекомендуется увеличивать значение параметра dpi (точек на дюйм) при сохранении.

Python
Скопировать код
plt.plot([1, 2, 3], [4, 5, 6])
plt.savefig('high_res_output.png', dpi=300)

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

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

Markdown
Скопировать код
У нас есть холст 🖼️ и кисти 🖌️ — это наши инструменты.

Если показать изображение до его сохранения, данные могут быть утеряны:

Python
Скопировать код
plt.show()  # 🖌️ кисти использованы
plt.savefig('beautiful_plot.png')  # 🖼️ холст при этом остаётся пустым!

Чтобы успеть зафиксировать картина, следуйте правильной последовательности: сначала рисуйте, потом сохраняйте:

Python
Скопировать код
plt.plot(x, y)  # 🖌️ мазки на холсте
plt.savefig('beautiful_plot.png')  # 🖼️ холст сохранён
plt.show()  # Теперь можно показать

Проверка полноты отображения данных

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

Python
Скопировать код
plt.plot([1, 2, 3], [4, 5, 6])
plt.xlabel('Ось Временных Путешествий')
plt.ylabel('Параллельные Вселенные')
plt.legend(['Теория Мультивселенной'], facecolor='white')
plt.savefig('complete_plot.png')

Графики на основе imshow и Seaborn

Функция imshow заслуживает такого же внимания, как и остальные:

Python
Скопировать код
plt.imshow(image_data)
plt.colorbar()  # Добавляем цветовую шкалу
plt.savefig('image_plot.png')  # Изображение сохранено

При использовании библиотеки Seaborn, вам пригодится параметр ax:

Python
Скопировать код
import seaborn as sns

fig, ax = plt.subplots()
sns.barplot(x="soup", y="crackers", data=df, ax=ax)
plt.savefig('seaborn_plot.png')

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

  1. matplotlib.pyplot.savefig — Документация Matplotlib 3.8.2: Полное описание функции savefig.
  2. Real Python Tutorial on Saving Plots: Подробное руководство по сохранению графиков.
  3. Visualization with Matplotlib | Python Data Science Handbook: Введение в Matplotlib с описанием типичных ошибок.
  4. Savefig outputs blank image – Stack Overflow: Обсуждение проблем с plt.show() и savefig() на StackOverflow.
  5. Issues · matplotlib/matplotlib · GitHub: Раздел проблем и ошибок Matplotlib на GitHub.

Обеспечение всей видимости данных

Прежде чем поделиться графиком, удостоверьтесь, что все данные видны, и они не скрыты за пределами осей:

Python
Скопировать код
plt.plot(x, y)
plt.xlim(0, 10)  # Задаём границы осей
plt.ylim(0, 10)
plt.savefig('data_visible_plot.png')  # Данные сохранены и видны

Правильное именование файлов

Чтобы избежать перезаписывания файлов, используйте уникальные временные метки в их именах:

Python
Скопировать код
from datetime import datetime

current_time = datetime.now().strftime('%Y%m%d_%H%M%S')
filename = f'plot_{current_time}.png'  # Имя файла с временной меткой
plt.savefig(filename)