Чтобы не отставать от последних трендов в области визуализации, я недавно услышал об Altair, который называет себя "библиотекой декларативной статистической визуализации для Python".
Оригинал статьи Криса тут
Меня особенно заинтересовало то, что он разработан Брайаном Грейнджером (Brian Granger) и Джейком Вандерпласом (Jake Vanderplas). Брайан является основным разработчиком проекта IPython и очень активен в научном сообществе Python. Джейк также активен в научном сообществе питонистов и написал прекрасную книгу "Python Data Science Handbook". Оба эти человека чрезвычайно опытны и хорошо осведомлены о Python и различных инструментах в его научной экосистеме. Из-за их прошлого мне было очень любопытно посмотреть, как они подошли к этой проблеме.
Одна из уникальных концепций дизайна Altair заключается в том, что он использует спецификацию Vega-Lite для создания "красивых и эффективных визуализаций с минимальным количеством кода".
Vega-Lite - это грамматика высокого уровня интерактивной графики. Она предоставляет краткий декларативный синтаксис JSON для создания выразительного набора визуализаций для анализа и представления данных.
Что это значит?
Altair предоставляет Python API для декларативного построения статистических визуализаций.
Под статистической визуализацией понимается:
DataFrame
, который состоит из столбцов с разными типами данных (количественные, порядковые, номинальные и дата/время).DataFrame
имеет аккуратный tidy формат, где строки соответствуют выборкам, а столбцы соответствуют наблюдаемым переменным.Altair пытается интерпретировать переданные ему данные и проделать некоторые разумные предположения о том, как их отображать. Делая разумные предположения, пользователь может тратить больше времени на изучение данных, чем на попытки разработать сложный API для их отображения.
Прежде чем двигаться дальше, я хотел бы выделить еще один уникальный аспект Altair, связанный с ожидаемым форматом данных. Как описано выше, Altair ожидает, что все данные будут в аккуратном (tidy) формате.
Общая идея заключается в том, что вы преобразуете свои данные в соответствующий формат, а затем используете API Altair для выполнения различных группировок или других методов сводки данных для вашей конкретной ситуации. Новым пользователям может потребоваться некоторое время, чтобы привыкнуть к этому. Тем не менее, я думаю, что в долгосрочной перспективе это хороший навык, и вложения в обработку данных (при необходимости) окупятся, в конце концов, путем обеспечения согласованного процесса визуализации данных.
Установим необходимые модули:
#!pip3 install altair
#!pip3 install vega_datasets
Начнем с демонстрации возможностей Altair.
В этом разделе поверхностно рассматриваются многие концепции, например, data
, marks
, encodings
, aggregation
, data types
, selections
и т. д. Позже мы вернемся к более глубокому рассмотрению каждой из них, поэтому не беспокойтесь, если покажется, что все идет слишком быстро!
Altair строится на спецификации Vega-Lite и вся терминология взята оттуда.
Начнем с импорта пакета Altair:
import altair as alt
Теперь воспользуемся пакетом vega_datasets, чтобы загрузить набор данных:
from vega_datasets import data
cars = data.cars()
cars.head()
Name | Miles_per_Gallon | Cylinders | Displacement | Horsepower | Weight_in_lbs | Acceleration | Year | Origin | |
---|---|---|---|---|---|---|---|---|---|
0 | chevrolet chevelle malibu | 18.0 | 8 | 307.0 | 130.0 | 3504 | 12.0 | 1970-01-01 | USA |
1 | buick skylark 320 | 15.0 | 8 | 350.0 | 165.0 | 3693 | 11.5 | 1970-01-01 | USA |
2 | plymouth satellite | 18.0 | 8 | 318.0 | 150.0 | 3436 | 11.0 | 1970-01-01 | USA |
3 | amc rebel sst | 16.0 | 8 | 304.0 | 150.0 | 3433 | 12.0 | 1970-01-01 | USA |
4 | ford torino | 17.0 | 8 | 302.0 | 140.0 | 3449 | 10.5 | 1970-01-01 | USA |
Используя Altair, можем исследовать эти данные.
Самая простая диаграмма (chart) содержит набор данных вместе с меткой (mark) для представления каждой строки:
alt.Chart(cars).mark_point()
Это довольно глупая диаграмма, потому что она состоит из 406
точек, расположенных друг над другом.
Чтобы сделать ее более интересной, необходимо закодировать (encode
) столбцы данных в визуальные элементы графика (plot), например, положение x
, положение y
, size
, color
и т. д.
Давайте закодируем мили на галлон (miles per gallon) по оси x
с помощью метода encode()
:
alt.Chart(cars).mark_point().encode(
x='Miles_per_Gallon'
)
Немного лучше, но point
(точечная) маркировка, вероятно, не самая лучшая для такой одномерной диаграммы.
Вместо этого попробуем задать tick
маркировку:
alt.Chart(cars).mark_tick().encode(
x='Miles_per_Gallon'
)
Можем развернуть в 2D-диаграмму, также закодировав значение y
.
Вернемся к использованию point
(точечной) маркировки и поместим Horsepower
(мощность в лошадиных силах) по оси y
:
alt.Chart(cars).mark_point().encode(
x='Miles_per_Gallon',
y='Horsepower'
)
Одна из самых приятных особенностей Altair - это грамматика взаимодействия, которую он предоставляет.
Самый простой вид взаимодействия - это возможность панорамировать (pan) и масштабировать (zoom) диаграммы; их можно включить с помощью метода interactive()
:
alt.Chart(cars).mark_point().encode(
x='Miles_per_Gallon',
y='Horsepower'
).interactive()
Это позволяет нажимать и перетаскивать, а также использовать прокрутку/масштабирование для увеличения и уменьшения масштаба диаграммы.
Позже мы увидим и другие варианты взаимодействия.
Двухмерный график (2D plot) позволяет кодировать два измерения данных.
Давайте посмотрим, как использовать цвет (color) для кодирования третьего измерения (Origin
):
alt.Chart(cars).mark_point().encode(
x='Miles_per_Gallon',
y='Horsepower',
color='Origin'
)