Даже статические графики помогают Data Sciеntist’y лучше разобраться с данными для анализа, а интерактивные графики полезней вдвойне. Сегодня мы расскажем о Python-библиотеке с простейшим интерфейсом — Pygal. Читайте далее: построение древовидных карт, столбчатых и круговых диаграмм, а также применение стилей оформления в Pygal.
Данные о больных COVID-19 в США
В качестве данных для визуализации возьмём датасет от New York Times, который содержит информацию о случаях заражения COVID-19 в штатах США с января по сентябрь. Данные постоянно обновляются — к старым значениям прибавляются новые. Поскольку он выложен в открытый доступ на Github, то его можно получить, передав ссылку в функцию read_csv:
import pandas as pd
df = pd.read_csv("https://raw.githubusercontent.com/nytimes/covid-19-data/master/us-counties.csv")
#
date county state fips cases deaths
0 2020-01-21 Snohomish Washington 53061.0 1 0
1 2020-01-22 Snohomish Washington 53061.0 1 0
2 2020-01-23 Snohomish Washington 53061.0 1 0
3 2020-01-24 Cook Illinois 17031.0 1 0
4 2020-01-24 Snohomish Washington 53061.0 1 0
... ... ... ... ... ... ...
[576582 rows x 6 columns]
Отображение интерактивных графиков в Jupyter
Pygal отображает графики на HTML-странице, а интерактивность получается за счет JavaScript. Если вы используете Jupyter или другой графический терминал IPython, то интерактивные графики можно получать прямо в нем. Если же нет, то придётся сохранять результаты в виде HTML-файлов и смотреть в браузере.
Авторы Pygal предоставляют код на JavaScript, поэтому нам нужно только лишь добавить ссылки на него в тэге <script>. Ниже представлен шаблон HTML, где в {render_chart} мы будем вставлять полученные графики.
base_html = """
<!DOCTYPE html>
<html>
<head>
<script src="http://kozea.github.com/pygal.js/javascripts/svg.jquery.js"></script>
<script src="https://kozea.github.io/pygal.js/2.0.x/pygal-tooltips.min.js""></script>
</head>
<body>
<figure>
{rendered_chart}
</figure>
</body>
</html>
"""
А для того чтобы в Jupyter отобразить график, который сохранен в виде HTML-страницы, нужно прописывать следующее:
from IPython.display import display, HTML display(HTML(base_html.format(rendered_chart=PYGAL_CHART)))
Вместо PYGAL_CHART мы будем ссылаться на графики Pygal.
Столбчатая диаграмма
Построим столбчатую диаграмму (bar chart) в Pygal. Поскольку нас интересует последние данные за сентябрь, мы сгруппируем их по штатам и возьмём максимальное количество случаев заражения. Вот так выглядит код на Python:
max_per_state = df.groupby('state')['cases'].max()
А чтобы получить график в Pygal требуется только две операции: создать соответствующий объект класса и вызвать метод add. Столбчатые диаграммы создаются через класс Bar. Поскольку метод add принимает в качестве аргументов заголовок и его значение, а не объект Series, то мы в цикле будем добавлять штат и количество случаев заражений. Код на Python выглядит следующим образом:
import pygal bar = pygal.Bar(height=300) bar.title = '# Cases in states' [bar.add(state, cases) for state, cases in max_per_state.items()] display(HTML(base_html.format(rendered_chart=bar.render(is_unicode=True))))
В итоге, получилась информативная столбчатая диаграмма, в которой при наведении на столбец появляется информация о штате и среднем количестве случаев заражения, а при наведении на штат из списка слева подсвечивается соответствующий столбец.
Если же вам требуется горизонтальная столбчатая диаграмма, просто вызывайте HorizontalBar вместо Bar.

Круговая диаграмма
Не менее полезной окажется круговая диаграмма (pie chart), например, когда нужно наглядно показать соотношение характеристик.
Для примера выберем в датасете первые 10 штатов, которые имеют самые высокие показатели заражения. Для этого просто сортируем в порядке убывания полученную в ходе группировки max_per_state. Вот так выглядит Python-код:
sort_by_cases = max_per_state.sort_values(ascending=False)[:10]
В Pygal круговая диаграмма имеет название Pie, поэтому выполняем все то же самое, что и в прошлый раз: создаём объект класса и вызываем метод add:
pie_chart = pygal.Pie(height=300) pie_chart.title = '# Cases in states' [pie_chart.add(state, cases) for state, cases in sort_by_cases.items()] display(HTML(base_html.format(rendered_chart=pie_chart.render(is_unicode=True))))

При наведении на саму диаграмму появляется информация о штате и среднем значении, при наведении на элемент списка подсвечивается соответствующая область.
Древовидная карта
В двух предыдущих случаях мы анализировали характер заражения только по штатам. Но в каждом штате есть округа, поэтому хотелось бы посмотреть и на них. Для этого пригодится древовидная карта (Tree map) — метод отображения иерархических данных с использованием вложенных фигур, обычно прямоугольников [1].
Сгруппируем данные по штату и округу, а затем создадим специальный словарь defaultdict, в котором ключом будет являться штат и значением — список словарей dict. Каждый такой словарь в списке будет иметь ключ (label) — округ, значение (value) — количество случаев заражения. После этого мы сортируем в порядке убывания все эти словари. В Python это выглядит следующим образом:
from collections import defaultdict
county_dict = defaultdict(list)
for place, cases in state_county.items():
state = place[0]
county = place[1]
county_dict[state].append({'label': county, 'value': cases})
for key in county_dict.keys():
county_dict[key].sort(key=lambda x: x['value'], reverse=True)
# полученнный словарь выглядит так:
>>> county_dict['New York']
[{'label': 'New York City', 'value': 247384},
{'label': 'Nassau', 'value': 46643},
{'label': 'Suffolk', 'value': 46387},
...]
Обязательным условием является название ключей и значений — label и value, иначе Pygal не сможет отобразить график. Осталось только отрисовать древовидную карту. Для этого напишем следующий код на Python:
treemap = pygal.Treemap(height=300) [treemap.add(key, value[:10]) for key, value in county_dict.items()] display(HTML(base_html.format(rendered_chart=treemap.render(is_unicode=True))))

Стили в Pygal
Все вышеперечисленные диаграммы были построены в базовом стиле Pygal. Однако можно воспользоваться другими 22 стилями, которые сделают диаграмму более тёмной или светлой. Эти стили хранятся в модуле style, для применения которых их следует указать в аргументе графика. Например, вот так в Python применяется стиль TurquoiseStyle к круговой диаграмме:
pie_chart = pygal.Pie(height=300, style=pygal.style.TurquoiseStyle) [pie_chart.add(state, cases) for state, cases in sort_by_cases.items()] display(HTML(base_html.format(rendered_chart=pie_chart.render(is_unicode=True))))

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



