Перейти к содержимому

Диаграммы

Диаграммы строятся с помощью библиотеки 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

Линейная диаграмма Altair в листе

Столбчатые диаграммы

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

Сгруппированная столбчатая диаграмма Altair в листе

Гистограммы

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

Гистограмма Altair в листе

Точечные диаграммы

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

Точечная диаграмма Altair в листе

Тепловые карты

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 в листе

Другие типы диаграмм

Полный набор типов диаграмм и примеры — в галерее 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
Была ли эта страница полезной?