Интерактивные и информативные диаграммы в Pygal

Даже статические графики помогают 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.

Диаграмма в Pygal в Pygal на Python
Столбчатая диаграмма в Pygal на Python

Круговая диаграмма

Не менее полезной окажется круговая диаграмма (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))))
Круговая диаграмма в Pygal на Python
Круговая диаграмма в Pygal на Python

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

Древовидная карта

В двух предыдущих случаях мы анализировали характер заражения только по штатам. Но в каждом штате есть округа, поэтому хотелось бы посмотреть и на них. Для этого пригодится древовидная карта (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))))
Tree map Pygal на Python
Древовидная карта в Pygal на Python

Стили в 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))))
Круговая диаграмма
Круговая диаграмма с другим стилем оформления в Pygal на Python

Если вы знаете CSS, то можете самостоятельно настроить стили под себя, добавив уникальности своим интерактивным Data Science графикам.

 

 

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

Источники
  1. https://en.wikipedia.org/wiki/Treemapping

Добавить комментарий

Поиск по сайту