Тема
Диаграммы
Диаграммы строятся с помощью библиотеки Vega-Altair — декларативной визуализации поверх Vega-Lite. График рисуется прямо в листе: достаточно в ячейке Python вернуть объект диаграммы последней строкой.
Несколько особенностей:
- Диаграмма попадает на лист, если объект
Chartстоит последней строкой ячейки. Вызывать.show()не нужно. - Библиотека
altairустанавливается автоматически при первомimport altair. - Размер врезки с диаграммой задаётся перетаскиванием краёв ячейки на листе;
width/heightв коде на размер врезки не влияют. - Чтобы заголовок не прилипал к шапке ячейки, добавьте отступ сверху —
padding={'top': 18}(как в примерах ниже). - Для наборов больше 5000 строк один раз вызовите
alt.data_transformers.disable_max_rows()— иначе Altair вызовет ошибкуMaxRowsError.
Линейные диаграммы
python
import altair as alt
import pandas as pd
alt.data_transformers.disable_max_rows()
# замените df своими данными
df = pd.DataFrame({
'month': ['Янв', 'Фев', 'Мар', 'Апр', 'Май', 'Июн', 'Июл', 'Авг', 'Сен', 'Окт', 'Ноя', 'Дек'],
'revenue': [120, 135, 128, 160, 175, 210, 198, 220, 245, 230, 260, 310],
})
# тип диаграммы; галерея: https://altair-viz.github.io/gallery/
chart = alt.Chart(df).mark_line(point=True).encode(
x=alt.X('month', sort=None, title='Месяц'),
y=alt.Y('revenue', title='Выручка, млн ₽'),
).properties(title='Выручка по месяцам, 2024', padding={'left': 5, 'top': 18, 'right': 5, 'bottom': 5})
chart
Столбчатые диаграммы
python
import altair as alt
import pandas as pd
# продажи по городам за два года, млн ₽
df = pd.DataFrame({
'city': ['Москва', 'Санкт-Петербург', 'Казань', 'Сочи', 'Новосибирск'] * 2,
'year': ['2023'] * 5 + ['2024'] * 5,
'sales': [98, 82, 50, 40, 35, 120, 95, 60, 45, 38],
})
# xOffset группирует столбцы внутри города, color задаёт цвет по году
chart = alt.Chart(df).mark_bar().encode(
x=alt.X('city', sort=None, title='Город'),
xOffset='year',
y=alt.Y('sales', title='Продажи, млн ₽'),
color=alt.Color('year', title='Год'),
).properties(title='Продажи по городам: 2023 и 2024', padding={'left': 5, 'top': 18, 'right': 5, 'bottom': 5})
chart
Гистограммы
python
import altair as alt
import pandas as pd
import numpy as np
# суммы заказов интернет-магазина (пример), средний чек ~2500 ₽
rng = np.random.default_rng(42)
df = pd.DataFrame({'amount': rng.normal(2500, 700, 800).round()})
# bin разбивает значения на интервалы, count() считает их число
chart = alt.Chart(df).mark_bar().encode(
x=alt.X('amount', bin=alt.Bin(maxbins=30), title='Сумма заказа, ₽'),
y=alt.Y('count()', title='Число заказов'),
).properties(title='Распределение суммы заказа', padding={'left': 5, 'top': 18, 'right': 5, 'bottom': 5})
chart
Точечные диаграммы
python
import altair as alt
import pandas as pd
import numpy as np
rng = np.random.default_rng(7)
n = 60
visits = rng.uniform(10, 60, n)
revenue = visits * rng.uniform(3, 5, n) + rng.normal(0, 15, n)
df = pd.DataFrame({
'visits': visits.round(1),
'revenue': revenue.round(),
'channel': rng.choice(['Поиск', 'Реклама', 'Соцсети'], n),
})
# color раскрашивает точки по категории
chart = alt.Chart(df).mark_circle(size=70).encode(
x=alt.X('visits', title='Визиты, тыс.'),
y=alt.Y('revenue', title='Выручка, тыс. ₽'),
color=alt.Color('channel', title='Канал'),
).properties(title='Выручка и трафик по каналам', padding={'left': 5, 'top': 18, 'right': 5, 'bottom': 5})
chart
Тепловые карты
python
import altair as alt
import pandas as pd
# продажи (млн ₽) по регионам и кварталам
df = pd.DataFrame([
{'quarter': q, 'region': r, 'sales': v}
for r, vals in {
'Север': [12, 18, 25, 30],
'Юг': [22, 35, 40, 28],
'Восток': [15, 20, 33, 45],
'Запад': [8, 14, 19, 27],
}.items()
for q, v in zip(['Q1', 'Q2', 'Q3', 'Q4'], vals)
])
base = alt.Chart(df).encode(
x=alt.X('quarter', title='Квартал'),
y=alt.Y('region', title='Регион'),
)
# слой цветных прямоугольников + слой с подписями значений
heat = base.mark_rect().encode(
color=alt.Color('sales', title='Продажи, млн ₽'),
)
text = base.mark_text(baseline='middle').encode(
text='sales',
color=alt.condition('datum.sales > 30', alt.value('white'), alt.value('black')),
)
chart = (heat + text).properties(title='Продажи по регионам', padding={'left': 5, 'top': 18, 'right': 5, 'bottom': 5})
chart
Другие типы диаграмм
Полный набор типов диаграмм и примеры — в галерее Altair: https://altair-viz.github.io/gallery/
Стилизация
Внешний вид настраивается параметрами марки (mark_*) и методами configure_*. Подробнее — в документации Altair: https://altair-viz.github.io/user_guide/customization.html
python
import altair as alt
import pandas as pd
df = pd.DataFrame({
'city': ['Москва', 'Санкт-Петербург', 'Казань', 'Сочи', 'Новосибирск'],
'sales': [120, 95, 60, 45, 38],
})
# оформление через параметры марки и методы configure_*
chart = alt.Chart(df).mark_bar(
color='#4C78A8', # цвет столбцов
cornerRadiusEnd=4, # скругление верхушки
).encode(
x=alt.X('city', sort='-y', title='Город'),
y=alt.Y('sales', title='Продажи, млн ₽'),
tooltip=['city', 'sales'],
).properties(
title='Продажи по городам',
).configure_axis(
grid=False, # убрать сетку
labelFontSize=12,
titleFontSize=13,
).configure_view(
stroke=None, # убрать рамку области
).configure_title(
fontSize=16,
anchor='start', # заголовок по левому краю
)
chart