Визуализация данных — фундаментальная часть 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 состоит из трех компонентов:
Selection
(Выделение) является объектом, с которым пользователь взаимодействует. Другими словами, он выбирает часть визуализации.Condition
(Условие) изменяет или настраивает элементы в зависимости от выбранной части визуализации. Чтобы увидеть результат, нам нужно привязать выделение к условию.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 )
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 вызывается функция 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
Теперь выделяя ту или иную область диаграммы рассеяния, меняется и гистограмма.
Меняем зависимости: диаграмма рассеяния зависит от гистограммы
Чтобы лучше понять концепции выделения и условия, поменяем местами роли между диаграммой рассеяния и гистограммой, т.е. пусть теперь диаграмма рассеяния зависит от гистограммы.
Для этого добавим выделение уже к гистограмме и будем использовать его как фильтр преобразования в диаграмме рассеяния. Пример кода на 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 в Москве.