(3)chart.add('', plot_dicts)
chart.render_to_file('bar_descriptions.svg')
Рис. 17.3. С каждым столбцом связывается нестандартная подсказка
В точке (1) определяется список с именем plot_dicts, который содержит три словаря: для проекта HTTPie, для проекта Django и для проекта Flask. Каждый словарь содержит два ключа: 'value' и 'label'. Pygal использует число, связанное с 'value', для определения высоты каждого столбца, а строка, связанная с 'label', используется для создания подсказки столбца. Например, первый словарь (2) создаст столбец, представляющий проект с 16 101 звездой, а в его подсказке будет содержаться текст Description of httpie.
Метод add() должен получать строку и список. При вызове add() передается список словарей, представляющих столбцы (plot_dicts) (3). Одна из подсказок изображена на рис. 17.3. Pygal включает количество звезд как подсказку по умолчанию в дополнение к нестандартной подсказке, которую мы определили в программе.
Нанесение данных на диаграмму
Чтобы построить диаграмму с данными, мы сгенерируем plot_dicts автоматически для 30 проектов, возвращенных вызовом API.
python_repos.py
...
# Анализ информации о репозиториях.
repo_dicts = response_dict['items']
print("Number of items:", len(repo_dicts))
(1) names, plot_dicts = [], []
for repo_dict in repo_dicts:
names.append(repo_dict['name'])
. .
(2) . .plot_dict = {
. . . .'value': repo_dict['stargazers_count'],
. . . .'label': repo_dict['description'],
. . . .}
(3) . .plot_dicts.append(plot_dict)
# Построение визуализации.
my_style = LS('#333366', base_style=LCS)
...
(4)chart.add('', plot_dicts)
chart.render_to_file('python_repos.svg')
В точке (1) создаются два пустых списка, names и plot_dicts. Список names все еще необходим для построения меток оси x.
Внутри цикла для каждого проекта создается словарь plot_dict (2). В нем количество звезд сохраняется с ключом 'value', а описание проекта — с ключом 'label'. Затем словарь plot_dict каждого проекта присоединяется к plot_dicts (3). В точке (4) список plot_dicts передается add(). Полученная диаграмма изображена на рис. 17.4.
Рис. 17.4. При наведении указателя мыши на столбец появляется описание проекта
Добавление активных ссылок на диаграмму
Pygal также позволяет использовать каждый столбец диаграммы как ссылку на сайт. Чтобы реализовать эту возможность, достаточно добавить всего одну строку кода, в которой используется словарь, создаваемый для каждого проекта. В словарь plot_dict каждого проекта добавляется новая пара «ключ—значение» с ключом 'xlink':
python_repos.py
...
names, plot_dicts = [], []
for repo_dict in repo_dicts:
names.append(repo_dict['name'])
plot_dict = {
'value': repo_dict['stargazers_count'],
'label': repo_dict['description'],
. . . .'xlink': repo_dict['html_url'],
}
plot_dicts.append(plot_dict)
...
Pygal использует URL-адрес, связанный с 'xlink', для преобразования каждого столбца в активную ссылку. Если щелкнуть на любом столбце диаграммы, в браузере автоматически открывается новая вкладка со страницей GitHub соответствующего проекта. Итак, мы создали интерактивную, содержательную визуализацию данных, загруженных через API!
API Hacker News
Чтобы познакомиться с использованием вызовов API для других сайтов, мы обратимся к сайту Hacker News (http://news.ycombinator.com/). На этом сайте пользователи делятся друг с другом статьями, посвященными программированию и технологиям, а также активно обсуждают эти статьи. API сайта Hacker News предоставляет доступ ко всем статьям и комментариям на сайте, а для его использования не требуется регистрация с получением ключа.
Следующий вызов возвращает информацию о текущей самой популярной статье (на момент написания книги):
https://hacker-news.firebaseio.com/v0/item/9884165.json
Ответ представляет собой словарь с информацией о статье с идентификатором 9884165:
{
(1) . .'url': 'http://www.bbc.co.uk/news/science-environment-33524589',
. .'type': 'story',
(2) . .'title': 'New Horizons: Nasa spacecraft speeds past Pluto',
(3) . .'descendants': 141,
. .'score': 230,
. .'time': 1436875181,
. .'text': '',
. .'by': 'nns',
. .'id': 9884165,
(4) . .'kids': [9884723, 9885099, 9884789, 9885604, 9885844]
}
Словарь содержит ряд ключей, которые могут нам пригодиться, — например, 'url' (1) и 'title' (2). Ключ 'descendants' содержит количество комментариев, полученных статьей (3). Ключ 'kids' предоставляет идентификаторы всех дочерних комментариев, сделанных непосредственно в ответ на эту статью (4). У каждого из этих комментариев могут быть свои дочерние комментарии, так что количество потомков у статьи может быть больше количества дочерних комментариев.
Создадим вызов API для получения идентификаторов статей, наиболее популярных на Hacker News, а затем рассмотрим каждую из этих статей:
hn_submissions.py
import requests
from operator import itemgetter
# Создание вызова API и сохранение ответа.
(1) url = 'https://hacker-news.firebaseio.com/v0/topstories.json'
r = requests.get(url)