Время прочтения: 3 мин.

Мы уже привыкли визуализировать данные для проведения анализа. В основном это статичные графики и схемы. Большой объём информации на графиках может усложнить восприятие и быть совсем неинформативным. Эту проблему может решить интерактивность визуализации. Библиотека Altair обладает таким функционалом.

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

Построить такой график можно, указав следующие параметры:

import altair
nearChart = altair.selection(type='single', nearest=True, on='mouseover', fields=['Дата'], empty='none')
line = altair.Chart().mark_line(interpolate='basis').encode(altair.X('Дата:T', axis=altair.Axis(title='')),
                                                        altair.Y('Значение:Q', axis=altair.Axis(title='',format='f')),
                                                            color='Категории:N')
  
selectors = altair.Chart().mark_point().encode(x='Дата:T',opacity=altair.value(0),).add_selection(nearChart)
points = line.mark_point().encode(opacity=altair.condition(nearChart, altair.value(1), altair.value(0)))
text = line.mark_text(align='left', dx=5, dy=-5).encode(text=altair.condition(nearChart, 'Значение:Q', altair.value(' ')))
rules = altair.Chart().mark_rule(color='gray').encode(x='Дата:T',).transform_filter(nearChart)
finChart = altair.layer(line, selectors, points, rules, text, data=data, width=800, height=500,title='Изменение трат, %')

finChart.save('index.html')
finChart

С этим графиком можно работать не только в нашем ноутбуке, но и отправить коллегам в формате HTML, встроить в страницу сайта или добавить в презентацию PowerPoint. Благодаря интерактивности такой график позволяет узнать индекс в любой точке.

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

Для этого добавим несколько строк кода:

selection = altair.selection_multi(fields=['Категории'])
color = altair.condition(selection, altair.Color('Категории:N', legend=None), altair.value('lightgray'))
line = altair.Chart(data).mark_line(interpolate='basis').encode(altair.X('Дата:T', axis=altair.Axis(title='')),altair.Y('Значение:Q', axis=altair.Axis(title='',format="f")), color=color).properties(width=800, height=500,title='Изменение трат, %')
legend = altair.Chart(data).mark_point().encode(y=altair.Y('Категории:N', axis=altair.Axis(orient='right')), color=color).add_selection(selection)
line | legend

Отдельно стоит упомянуть возможность создания интерактивных карт с возможностью отображения подсказки и подсветки при наведении курсора. Например, карта с отображением средней заработной платы по регионам России может выглядеть так:

Для построения таких карт используются shape-файлы (векторное представление о территории на карте), которые сейчас можно найти практически для любых территорий:

import altair as alt
import pandas as pd
import geopandas as gpd

gdf = gpd.read_file('../input/russia-shp2-salary-info/Regions.shp', encoding='utf-8')
df = pd.read_csv('../input/russia-shp2-salary-info/zarplata2.csv', encoding='utf-8', sep=';')

Объединяем shape-файл с файлом данных:

gdf = gdf.merge(df, how="left", left_on='NAME', right_on='Region')
gdf = gdf.drop_duplicates('Region')

Задаём параметры тела графика (mapChart), задний и передний слои карты (bg и fg), всплывающие подсказки, а также проекцию карты (подробнее о проекции ):

bg = alt.Chart(gpd.read_file('../input/russia-shp2-salary-info/Regions.shp')).mark_geoshape(fill='lightgray', stroke='white').encode(tooltip=['NAME']).properties(width=600, height=400)
fg = alt.Chart(gdf).mark_geoshape(stroke='white').encode(color='Value', tooltip=['NAME', 'Value']).properties(width=600, height=400)

mapChart = alt.LayerChart().configure_projection(type='azimuthalEquidistant', scale=540, rotate=[-119, -49, 27], center=[-20, 14]).properties(title="Средняя З/П по регионам РФ")

Объединим слои в теле графика и выведем конечный результат:

mapChart = mapChart.add_layers(bg)
mapChart = mapChart.add_layers(fg)
mapChart

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