(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 включает количество звезд как подсказку по ­умолчанию в дополнение к нестандартной подсказке, которую мы определили в программе.

<p>Нанесение данных на диаграмму</p>

Чтобы построить диаграмму с данными, мы сгенерируем 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. При наведении указателя мыши на столбец появляется описание проекта

<p>Добавление активных ссылок на диаграмму</p>

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!

<p>API Hacker News</p>

Чтобы познакомиться с использованием вызовов 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)

Перейти на страницу:

Все книги серии Библиотека программиста

Похожие книги