--- name: visualization description: | график, диаграмма, визуализация, нарисуй, построй график, динамика на графике, тренд, столбчатая, линейная, гистограмма, scatter, heatmap, барчарт --- ## Skill: Визуализация данных (matplotlib / seaborn) ### Когда строить график График — только если вопрос про: - динамику во времени (тренд по дням/неделям/месяцам) - сравнение нескольких сущностей (3+ кампаний, каналов, сегментов) - распределение значений (гистограмма, boxplot) На факты и разовые цифры — график не нужен. ### Обязательные правила оформления ```python import matplotlib.pyplot as plt import seaborn as sns # Подписи ТОЛЬКО на русском: plt.title("Динамика визитов по неделям", fontsize=14) plt.xlabel("Неделя") plt.ylabel("Визиты") # Обязательно перед следующим plt.figure(): plt.tight_layout() # Легенда если несколько линий: plt.legend(loc='best') ``` ### Настройки фигуры ```python fig, ax = plt.subplots(figsize=(12, 6)) # или для двух рядом: fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 6)) ``` ### Форматирование осей с большими числами ```python import matplotlib.ticker as mticker ax.yaxis.set_major_formatter(mticker.FuncFormatter(lambda x, _: f"{x:,.0f}")) ``` ### Цветовые палитры ```python # Для нескольких категорий: colors = sns.color_palette("husl", n_colors=len(df['category'].unique())) # Для тепловой карты: sns.heatmap(pivot, cmap='YlOrRd', fmt='.0f', annot=True) ``` ### Типы графиков по задаче | Задача | Тип графика | |---|---| | Динамика по времени | `plt.plot()` или `sns.lineplot()` | | Сравнение категорий | `sns.barplot()` или `plt.bar()` | | Распределение | `sns.histplot()` или `sns.boxplot()` | | Два показателя | `plt.twinx()` (двойная ось Y) | | Доли | `plt.pie()` — только если <6 категорий | ### Запрещено - Эмодзи в подписях осей и заголовках - Английские подписи (всё на русском) - График без `plt.tight_layout()` - `plt.show()` — не нужен в sandbox, вывод захватывается автоматически - `plt.savefig(...)` — **НЕЛЬЗЯ**, сохранение в файл ломает захват изображения sandbox'ом, пользователь не увидит график - `plt.close()` / `plt.close("all")` — **НЕЛЬЗЯ**, закрытие фигуры до захвата sandbox'ом даст пустой белый лист - `plt.savefig(...)` — **никогда не вызывать**. Sandbox сам захватывает все открытые фигуры после выполнения кода. Вызов savefig ничего не добавляет, а `plt.close()` после него сделает график невидимым для пользователя - `plt.close()` / `plt.close("all")` — **никогда не вызывать**. Закрытая фигура не будет захвачена sandbox'ом и не будет показана пользователю