В точке (1) мы создаем экземпляр класса Worldmap и задаем атрибут title объекта карты. В точке (2) используется метод add(), который получает метку и список кодов стран, на которых вы хотите сосредоточиться. Каждый вызов add() создает новый цвет для набора стран и добавляет этот цвет в список условных обозначений в левой части диаграммы с заданным текстом. Весь регион Северной Америки будет представлен одним цветом, поэтому мы включаем коды 'ca', 'mx' и 'us' в список, передаваемый первому вызову add(), для единого представления на карте Канады, Мексики и Соединенных Штатов. Затем то же самое делается для стран Центральной и Южной Америки.

Метод render_to_file() в точке (3) создает файл .svg с диаграммой; вы можете открыть этот файл в своем браузере. На полученной карте Северная, Центральная и Южная Америка выделены другими цветами (рис. 16.7).

Рис. 16.7. Простой экземпляр диаграммы Worldmap

Теперь вы знаете, как создать карту с цветными областями, условные обозначения и аккуратные метки. Добавим на карту данные для вывода информации о стране.

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

Чтобы потренироваться с нанесением числовых данных на карту, создайте карту с населением трех стран Северной Америки:

na_populations.py

import pygal

wm = pygal.Worldmap()

wm.title = 'Populations of Countries in North America'

(1) wm.add('North America', {'ca': 34126000, 'us': 309349000, 'mx': 113423000})

. .

wm.render_to_file('na_populations.svg')

Рис. 16.8. Численность населения стран Северной Америки

Сначала мы создаем экземпляр Worldmap и назначаем заголовок. Далее снова следует вызов add(), но на этот раз во втором аргументе передается словарь вместо списка (1) . Словарь содержит двухбуквенные коды стран Pygal (ключи) и численность населения (значения). Pygal автоматически использует числа для окраски стран от светлых (менее населенные) до темных (наиболее населенные). На рис. 16.8 показана полученная карта.

Эта карта интерактивна: если вы наведете указатель мыши на каждую страну, то увидите ее население. Добавим на карту побольше данных.

<p>Построение полной карты населения</p>

Чтобы нанести на карту данные численности населения для других стран, обработанные ранее данные необходимо преобразовать в формат словаря Pygal: с двухбуквенными кодами стран и численностью населения, образующими пары «ключ—значение». Добавьте следующий код в world_population.py:

world_population.py

import json

import pygal

from country_codes import get_country_code

# Список заполняется данными.

...

# Построение словаря с данными численности населения.

(1) cc_populations = {}

for pop_dict in pop_data:

if pop_dict['Year'] == '2010':

country = pop_dict['Country Name']

population = int(float(pop_dict['Value']))

code = get_country_code(country)

if code:

(2) . . . . . .cc_populations[code] = population

(3)wm = pygal.Worldmap()

wm.title = 'World Population in 2010, by Country'

(4)wm.add('2010', cc_populations)

. .

wm.render_to_file('world_population.svg')

Сначала импортируется модуль pygal. В точке (1) создается пустой словарь для хранения кодов стран и численности населения в формате, принятом Pygal. В точке (2) для полученных кодов строится очередной элемент словаря cc_populations; ключом пары становится код страны, а значением — численность населения. Также из программы удаляются все команды print.

Мы создаем экземпляр Worldmap и задаем его атрибут title (3). При вызове add() передается словарь с кодами стран и значениями численности населения (4).

На рис. 16.9 изображена полученная карта.

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

Рис. 16.9. Численность мирового населения в 2010 году

много стран окрашено в светлые тона, а стран с темной окраской всего две. Контраст между большинством стран попросту недостаточен для того, чтобы зритель мог понять, в какой стране больше или меньше население. Чтобы решить эту проблему, мы сгруппируем страны по уровням населения и окрасим каждую группу по отдельности.

<p>Группировка стран по населению</p>

Китай и Индия по численности населения опережают все остальные страны, поэтому нашей карте не хватает контраста. И в Китае, и в Индии проживает свыше миллиарда человек, тогда как в следующей по численности населения стране — Соединенных Штатах — население составляет около 300 миллионов. Вместо того чтобы наносить на диаграмму все страны в одной группе, разделим страны на три уровня населения: менее 10 миллионов, от 10 миллионов до 1 миллиарда и более 1 миллиарда:

world_population.py

...

# Построение словаря с данными численности населения.

cc_populations = {}

for pop_dict in pop_data:

if pop_dict['Year'] == '2010':

--snip--

if code:

cc_populations[code] = population

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

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

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