Altair — библиотека для построения интерактивных графиков

Визуализация данных — фундаментальная часть Data Science. В рамках анализа данных визуализация помогает обнаружить взаимосвязи между атрибутами, более того, графики и диаграммы несут большую информативность, чем голые числа, поэтому их применяют в отчетах. В этой статье мы расскажем о такой Python библиотеке визуализации данных, как Altair. Читайте далее, основные компоненты Altair, как строить обычные и интерактивные диаграмма, а также как связывать их вместе с примерами кода на Python.

Установка Altair и подготовка датасета

Если вы используется пакетный менеджер Pip, то для установки библиотеки Altair используйте следующую команду в терминале:

pip install altair

Если у вас Anaconda (Miniconda), то введите:

conda install -c conda-forge altair

После этого в Python импортируем необходимые библиотеки: NumPy, Pandas и Altair:

import numpy as np
import pandas as pd
import altair as alt

Для демонстрации работы в Altair будем использовать датасет с ценами на дом в Мельбурне. Его качать не нужно, поскольку в Pandas мы укажем ссылку на него.

Для большей скорости мы не будем читать все столбцы, а также дополнительно отфильтруем данные. В аргументе usecols функции для чтения Pandas укажем только необходимые нам столбцы. Отфильтруем мы по цене на дом и по размеру земли, а затем из отфильтрованных значений выберем 1000 случайных строк. Код на Python для фильтрации данных выглядит так:

url = ("https://raw.githubusercontent.com/DataLatata/" + 
       "python-school/master/Melbourne/melbourn.csv")
usecols = ['Price','Landsize','Distance','Type', 'Regionname']

df = pd.read_csv(url, usecols=usecols)
df = (df[(df.Price < 3_000_000) & (df.Landsize < 1200)]
    .sample(n=1000)
    .reset_index(drop=True)
)

Первые пять строк:

  Type      Price  Distance  Landsize                  Regionname
0    u   490000.0       9.3       0.0       Southern Metropolitan
1    h   877500.0      17.5     598.0  South-Eastern Metropolitan
2    h  2200000.0       9.7     651.0       Southern Metropolitan
3    h  1900000.0       5.7     474.0       Northern Metropolitan
4    h  2950000.0       7.8     661.0       Southern Metropolitan

Компоненты Altair

Altair — мощная Python-библиотека с точки зрения преобразования данных и создания интерактивных графиков. Интерактивность в Altair состоит из трех компонентов:

  1. Selection (Выделение) является объектом, с которым пользователь взаимодействует. Другими словами, он выбирает часть визуализации.
  2. Condition (Условие) изменяет или настраивает элементы в зависимости от выбранной части визуализации. Чтобы увидеть результат, нам нужно привязать выделение к условию.
  3. Bind (Связывание) связывает выбранную часть визуализации и входные значения.

Эти компоненты мы рассмотрим в примерах на Python

Ваш первый график в Altair

Интерфейс библиотеки реализует функциональное программирование, поэтому вы увидите как после одной функции вызывается следующая, после которого идет еще одна и т.д (похожее наблюдает в PySpark).

Итак, создадим свою первый график, например, диаграмму рассеяния. Пример кода на Python для создания диаграммы рассеяния в Altair выглядит следующим образом:

alt.Chart(df).mark_circle(size=50).encode(
   x='Price',
   y='Distance',
   color='Type'
).properties(
   height=250, width=450
)
Диаграмма рассеяния в Altair (Python)
Неинтерактивная диаграмма рассеяния

Chart — это основной объект для создания графиков. В него мы передаем датафрейм с данными или ссылку на файла CSV или JSON.

Затем мы описываем какой тип визуализации мы хотим получить, например, при mark_circle — данные представляется точками, а при mark_line — линиями (полный список в документации).

Функция encode указывает, какие атрибуты отображать из переданного датафрейма. Поэтому, все, что мы пишем в этой функции, должно быть связано с датафреймом.

Наконец, в функции properties мы указываем свойства графика, которые хотим получить. Это может быть ширина или высота графика, цвет, шрифт, отступы, радиусы скруглений и т.д. (полный список в документации).

Добавляем интерактивности: выделяем нужные атрибуты

Точек на график получилось очень много. Добавим возможность засветлять только точки выбранного типа дома (атрибут Type).

Этого можно добиться в два шага. Во-первых, добавим выделение со столбцом Type, во-вторых, привяжем выделение к легенде. Пример кода на Python для создания выделения с привязкой к легенде в Altair:

selection = alt.selection_multi(fields=['Type'], bind='legend')

Теперь выставим условие (condition):

  • Если выполнено выделение: установить над ним непрозрачность 1
  • Если это не выделение: установить непрозрачность 0.1

Иными словами, те точки, что соответствует указанному выделение (в нашем случае это выбранный Type) сделать непрозрачным, а остальные точки — прозрачными.
Код на Python для добавления выделения и условия выглядит следующим образом:

alt.Chart(df).mark_circle(size=50).encode(
   x='Price',
   y='Distance',
   color='Type',
   opacity=alt.condition(selection, alt.value(1), alt.value(0.1))
).properties(
   height=250, width=450
).add_selection(
   selection
)
Интерактивная диаграмма в Altair (Python)
Интерактивная диаграмма рассеяния

Еще интерактивности: связываем несколько диаграмм

Добавим к имеющейся диаграмме рассеяния еще гистограмму, причем такую, которая будет обновляться в зависимости от выбранного выделения на диаграмме рассеяния.

Поскольку мы хотим выбрать область на графике, нам нужно добавить интервал выделения. Для этого в Altair вызывается функция selection_interval:

selection = alt.selection_interval()

Это выделение будет добавлено к диаграмме рассеяния. А для гистограммы используем это выделение в фильтре преобразования (transform_filter). Код на Python для связывания двух графиков выглядит следующим образом:

chart1 = alt.Chart(df).mark_circle(size=50).encode(
  x='Landsize',
  y='Distance',
  color='Type'
).properties(
  height=250, width=450
).add_selection(
  selection
)
chart2 = alt.Chart(df).mark_bar().encode(
  alt.X('Price:Q', bin=True),
  alt.Y('count()')
).transform_filter(
  selection
)

Обратите внимание, для гистограммы мы указываем количественное значение :Q. А по оси Y мы указали агрегирующую функцию count для подсчета значений. То, что здесь мы указали являются сокращениями. То же самое можно выполнить и передачей аргументов. О сокращениях смотрите в документации.

Для вывода связанных диаграмм применяется логический оператор ИЛИ |:

chart1 | chart2
Связанные графики в Altair
Диаграмма рассеяния и зависящая от нее гистограмма

Теперь выделяя ту или иную область диаграммы рассеяния, меняется и гистограмма.

Меняем зависимости: диаграмма рассеяния зависит от гистограммы

Чтобы лучше понять концепции выделения и условия, поменяем местами роли между диаграммой рассеяния и гистограммой, т.е. пусть теперь диаграмма рассеяния зависит от гистограммы.

Для этого добавим выделение уже к гистограмме и будем использовать его как фильтр преобразования в диаграмме рассеяния. Пример кода на Python для создания зависимости диаграммы рассеяния от гистограммы в Altair.

selection = alt.selection_interval()
chart1 = alt.Chart(df).mark_circle(size=50).encode(
   x='Landsize',
   y='Distance',
   color='Type'
).properties(
   height=250, width=450
).transform_filter(
   selection
)
chart2 = alt.Chart(df).mark_bar().encode(
   alt.X('Price:Q', bin=True), alt.Y('count()')
).add_selection(
   selection
)
chart1 | chart2
Связанные диаграмма рассеяния и гистограмма
Гистограмма и зависящая от нее диаграмма рассеяния

Несмотря на непривычный на первый взгляд интерфейс, библиотека Altair может стать вашим хорошим помощником для визуализации данных и создания интерактивных графиков, а также может заменить Plotly.

 

Еще больше подробностей о визуализации данных на Python, в том числе и с помощью Altair, на реальных примерах Data Science вы узнаете на специализированном курсе по машинному обучению «VIP: Визуализация данных на языке Python» в лицензированном учебном центре обучения и повышения квалификации разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве.

Добавить комментарий

Поиск по сайту