Собесов

Сценарий: matplotlib для презентационного графика

PythonVisualizationЛёгкаяJunior

Условие

Сделай в matplotlib чистый график «выручка по неделям» так, чтобы он не стыдно вставить в слайды.

Решение

import matplotlib.pyplot as plt
 
fig, ax = plt.subplots(figsize=(10, 5))
 
ax.plot(df['week'], df['revenue'], linewidth=2.5, color='#2E86AB')
ax.fill_between(df['week'], df['revenue'], alpha=0.15, color='#2E86AB')
 
# Убираем мусор
for spine in ['top', 'right']:
    ax.spines[spine].set_visible(False)
ax.spines['left'].set_color('#888')
ax.spines['bottom'].set_color('#888')
 
# Сетка по Y, мягкая
ax.grid(axis='y', alpha=0.3, linestyle='--')
ax.set_axisbelow(True)
 
# Форматирование осей
ax.set_ylabel('Выручка, ₽', fontsize=11, color='#444')
ax.set_xlabel('')
ax.tick_params(colors='#555', labelsize=10)
 
# Y-ось в тысячах/миллионах
from matplotlib.ticker import FuncFormatter
ax.yaxis.set_major_formatter(FuncFormatter(lambda x, _: f'{x/1e6:.1f}M ₽'))
 
# Заголовок и подзаголовок
fig.suptitle('Недельная выручка', fontsize=15, fontweight='bold', x=0.13, ha='left', y=0.98)
ax.set_title('по данным за 2024 год', fontsize=11, loc='left', color='#777', pad=10)
 
# Аннотация последней точки
last = df.iloc[-1]
ax.annotate(f'{last["revenue"]/1e6:.1f}M ₽',
            xy=(last['week'], last['revenue']),
            xytext=(10, 0), textcoords='offset points',
            fontsize=11, fontweight='bold', color='#2E86AB',
            va='center')
 
plt.tight_layout()
plt.savefig('revenue.png', dpi=200, bbox_inches='tight', facecolor='white')

Чек-лист презентационного графика

  • Нет лишних spine (top/right убраны).
  • Шрифты ≥ 11 pt, контрастный заголовок.
  • Осей две, без двойных axes.
  • Числа на оси Y отформатированы (M ₽ / k / %).
  • Подсветка ключевой точки/значения.
  • Цветов ≤ 3, не радуга.
  • dpi ≥ 200 для печати.

Подводные камни

  1. Дефолтный matplotlib выглядит «по-научному» — слишком много сетки, spine, мелкий шрифт. Всегда чистить.
  2. dpi=72 — для веба, для слайдов мало. Ставьте 200+.
  3. Title через ax.set_title маленький, для презентации — fig.suptitle крупнее.
  4. tight_layout иногда обрезает аннотации — bbox_inches='tight' при сохранении лучше.
  5. Цветовая палитра по умолчанию (tab10) скучная. Бренд-цвета приятнее.

Эталонный ответ

Убрать top/right spines, мягкая сетка по Y, форматер на оси (M ₽), один-два цвета, аннотация ключевой точки, dpi=200.

Хочешь увидеть разбор?

Зарегистрируйся бесплатно — откроется развёрнутое решение этой задачи и ещё 4 на выбор.

Зарегистрироваться и увидеть разбор
Уже есть аккаунт? Войти