Теперь, когда мы познакомились с основными частями API Altair (см. часть 1 и часть 2), пришло время попрактиковаться в его использовании для изучения нового набора данных.
Выберите один из следующих четырех наборов данных, подробно описанных ниже.
Изучая данные, вспомните о строительных блоках, которые мы обсуждали ранее:
mark_point()
, mark_line()
, mark_tick()
, mark_bar()
, mark_area()
, mark_rect()
и т. д.x
, y
, color
, shape
, size
, row
, column
, text
, tooltip
и т. д.alt.layer
<-> +
, alt.hconcat
<-> |
, alt.vconcat
<-> &
)Начните с простого. Какие кодировки лучше всего работают с количественными данными? С категориальными данными? Что вы можете узнать о своем наборе данных с помощью этих инструментов?
from vega_datasets import data
Эти данные включают суточные осадки (daily precipitation), диапазон температур (temperature range), скорость ветра (wind speed) и тип погоды в зависимости от даты в период с 2012
по 2015
год в Сиэтле.
weather = data.seattle_weather()
weather.head()
date | precipitation | temp_max | temp_min | wind | weather | |
---|---|---|---|---|---|---|
0 | 2012-01-01 | 0.0 | 12.8 | 5.0 | 4.7 | drizzle |
1 | 2012-01-02 | 10.9 | 10.6 | 2.8 | 4.5 | rain |
2 | 2012-01-03 | 0.8 | 11.7 | 7.2 | 2.3 | rain |
3 | 2012-01-04 | 20.3 | 12.2 | 5.6 | 4.7 | rain |
4 | 2012-01-05 | 1.3 | 8.9 | 2.8 | 6.1 | rain |
Эти данные включают численность населения (population), рождаемости (fertility) и ожидаемой продолжительности жизни в ряде стран мира.
Обратите внимание: хотя у вас может возникнуть соблазн использовать временное кодирование для года, здесь год - это просто число, а не отметка даты, поэтому временное кодирование здесь не лучший выбор.
gapminder = data.gapminder()
gapminder.head()
year | country | cluster | pop | life_expect | fertility | |
---|---|---|---|---|---|---|
0 | 1955 | Afghanistan | 0 | 8891209 | 30.332 | 7.7 |
1 | 1960 | Afghanistan | 0 | 9829450 | 31.997 | 7.7 |
2 | 1965 | Afghanistan | 0 | 10997885 | 34.020 | 7.7 |
3 | 1970 | Afghanistan | 0 | 12430623 | 36.088 | 7.7 |
4 | 1975 | Afghanistan | 0 | 14132019 | 38.438 | 7.7 |
Эти данные содержат информацию о населении США, разделенное по возрасту и полу каждое десятилетие с 1850
года до настоящего времени.
Обратите внимание: хотя у вас может возникнуть соблазн использовать временное кодирование для года, здесь год - это просто число, а не отметка даты, и поэтому временное кодирование - не лучший выбор.
population = data.population()
population.head()
year | age | sex | people | |
---|---|---|---|---|
0 | 1850 | 0 | 1 | 1483789 |
1 | 1850 | 0 | 2 | 1450376 |
2 | 1850 | 5 | 1 | 1411067 |
3 | 1850 | 5 | 2 | 1359668 |
4 | 1850 | 10 | 1 | 1260099 |
Набор данных фильмов содержит данные о 3200
фильмах, включая дату выпуска, бюджет и рейтинги IMDB и Rotten Tomatoes.
movies = data.movies()
movies.head()
Title | US Gross | Worldwide Gross | US DVD Sales | Production Budget | Release Date | MPAA Rating | Running Time min | Distributor | Source | Major Genre | Creative Type | Director | Rotten Tomatoes Rating | IMDB Rating | IMDB Votes | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | The Land Girls | 146083.0 | 146083.0 | NaN | 8000000.0 | Jun 12 1998 | R | NaN | Gramercy | None | None | None | None | NaN | 6.1 | 1071.0 |
1 | First Love, Last Rites | 10876.0 | 10876.0 | NaN | 300000.0 | Aug 07 1998 | R | NaN | Strand | None | Drama | None | None | NaN | 6.9 | 207.0 |
2 | I Married a Strange Person | 203134.0 | 203134.0 | NaN | 250000.0 | Aug 28 1998 | None | NaN | Lionsgate | None | Comedy | None | None | NaN | 6.8 | 865.0 |
3 | Let's Talk About Sex | 373615.0 | 373615.0 | NaN | 300000.0 | Sep 11 1998 | None | NaN | Fine Line | None | Comedy | None | None | 13.0 | NaN | NaN |
4 | Slam | 1009819.0 | 1087521.0 | NaN | 1000000.0 | Oct 09 1998 | R | NaN | Trimark | Original Screenplay | Drama | Contemporary Fiction | None | 62.0 | 3.4 | 165.0 |
Интерактивность и грамматика выбора Altair - одна из его уникальных особенностей среди доступных графических библиотек. В этом разделе мы рассмотрим различные доступные типы выбора и начнем практиковаться в создании интерактивных диаграмм и информационных панелей (dashboards).
Доступны три основных типа выбора:
alt.selection_interval()
alt.selection_single()
alt.selection_multi()
И расскажем о четырех основных вещах, которые вы можете делать с этими выборками.
import altair as alt
from vega_datasets import data
Основные взаимодействия, которые предоставляет Altair, - это панорамирование (panning), масштабирование (zooming) и всплывающие подсказки (tooltips). Это можно сделать на диаграмме без использования интерфейса выбора, используя метод interactive()
и кодировку tooltip
.
Например, с нашим стандартным набором данных про автомобили мы можем сделать следующее:
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 |
alt.Chart(cars).mark_point().encode(
x='Horsepower:Q',
y='Miles_per_Gallon:Q',
color='Origin',
tooltip='Name'
).interactive()
В этот момент при наведении курсора на точку появится всплывающая подсказка с названием модели автомобиля, а нажатие/перетаскивание/прокрутка приведет к панорамированию и масштабированию графика.
В качестве примера выбора (selection) давайте добавим интервальное выделение на график.
Начнем с классического графика рассеяния (scatter plot):
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 |
alt.Chart(cars).mark_point().encode(
x='Horsepower:Q',
y='Miles_per_Gallon:Q',
color='Origin'
)
Чтобы добавить поведение выбора к диаграмме, мы создаем объект выбора и используем метод add_selection
:
interval = alt.selection_interval()
alt.Chart(cars).mark_point().encode(
x='Horsepower:Q',
y='Miles_per_Gallon:Q',
color='Origin'
).add_selection(
interval
)
Это добавляет к графику взаимодействие, которое позволяет выбирать точки на графике; возможно, наиболее распространенное использование выделения - это выделение точек путем определения их цвета в зависимости от результата выбора.
Это можно сделать с помощью alt.condition
:
interval = alt.selection_interval()
alt.Chart(cars).mark_point().encode(
x='Horsepower:Q',
y='Miles_per_Gallon:Q',
color=alt.condition(interval, 'Origin', alt.value('lightgray'))
).add_selection(
interval
)
Функция alt.condition
принимает три аргумента: объект выбора, значение, которое будет применяться к точкам внутри выделения, и значение, которое будет применено к точкам вне выделения. Здесь мы используем alt.value('lightgray')
, чтобы убедиться, что цвет обрабатывается как фактический цвет, а не как имя столбца данных.
Функция alt.selection_interval()
принимает ряд дополнительных аргументов; например, задавая encodings
, мы можем контролировать, охватывает ли выделение x
, y
или обе оси:
interval = alt.selection_interval(encodings=['x'])
alt.Chart(cars).mark_point().encode(
x='Horsepower:Q',
y='Miles_per_Gallon:Q',
color=alt.condition(interval, 'Origin', alt.value('lightgray'))
).add_selection(
interval
)