# Группировка стран по 3 уровням населения.
(1) cc_pops_1, cc_pops_2, cc_pops_3 = {}, {}, {}
(2)for cc, pop in cc_populations.items():
. .if pop < 10000000:
. . . .cc_pops_1[cc] = pop
. .elif pop < 1000000000:
. . . .cc_pops_2[cc] = pop
. .else:
. . . .cc_pops_3[cc] = pop
# Проверка количества стран на каждом уровне.
(3)print(len(cc_pops_1), len(cc_pops_2), len(cc_pops_3))
wm = pygal.Worldmap()
wm.title = 'World Population in 2010, by Country'
x wm.add('0-10m', cc_pops_1)
wm.add('10m-1bn', cc_pops_2)
wm.add('>1bn', cc_pops_3)
. .
wm.render_to_file('world_population.svg')
Чтобы сгруппировать страны, мы создаем пустой словарь для каждой категории (1) . Затем программа перебирает cc_populations и проверяет население каждой страны (2). Блок if-elif-else добавляет элемент в соответствующий словарь (cc_pops_1, cc_pops_2 или cc_pops_3) для каждой пары «код страны—население».
Рис. 16.10. Численность мирового населения в 2010 году
В точке (3) выводится длина каждого словаря для определения размеров групп. При нанесении данных на диаграмму (4) все три группы добавляются на диаграмму Worldmap. При запуске программы сначала выводятся размеры всех групп:
85 69 2
Вывод показывает, что существуют 85 стран с населением менее 10 миллионов, 69 стран с населением от 10 миллионов до 1 миллиарда и две особые страны с населением свыше 1 миллиарда. Разбиение получается достаточно равномерным для получения содержательной карты. Полученная карта изображена на рис. 16.10.
Три разных цвета помогают подчеркнуть различия между уровнями населения. В каждом из трех уровней страны окрашиваются от светлого к темному оттенку в соответствии с ростом численности населения.
Оформление карты мира в Pygal
Группировка стран на карте работает эффективно, но цвета по умолчанию выбираются довольно странно: например, в нашем примере Pygal выбирает схему с ярко-розовым и зеленым цветом. Директивы оформления Pygal помогут решить проблему с цветами.
В новой версии мы снова прикажем Pygal использовать один базовый цвет, но на этот раз выберем цвет и применим более выразительные оттенки для трех групп численности населения:
world_population.py
import json
import pygal
(1) from pygal.style import RotateStyle
...
# Группировка стран по 3 уровням населения.
cc_pops_1, cc_pops_2, cc_pops_3 = {}, {}, {}
for cc, pop in cc_populations.items():
. .if pop < 10000000:
. . . ....
(2)wm_style = RotateStyle('#336699')
(3)wm = pygal.Worldmap(style=wm_style)
wm.title = 'World Population in 2010, by Country'
...
Стили Pygal хранятся в модуле style, из которого программа импортирует стиль RotateStyle (1) . Этот класс получает один аргумент — цвет RGB в шестнадцатеричном формате (2). Затем Pygal выбирает цвета каждой группы на основании переданного цвета. Цвет в шестнадцатеричном формате представляет собой строку из символа решетки (#), за которым следуют шесть символов: первые два представляют красную составляющую цвета, следующие два — зеленую и последние два — синюю. Значения составляющих лежат в диапазоне от 00 (нулевая интенсивность) до FF (максимальная интенсивность). В Интернете можно легко найти приложение для экспериментов с цветами и получения соответствующих значений RGB. Цвет, используемый в данном случае (#336699), содержит немного красного (33), чуть больше зеленого (66) и еще больше синего (99). В результате RotateStyle назначается светло-синий базовый цвет для выполнения дальнейших операций.
RotateStyle возвращает объект стиля, который сохраняется в переменной wm_style. Чтобы использовать объект стиля, передайте его в именованном аргументе при создании экземпляра Worldmap (3). На рис. 16.11 изображена обновленная диаграмма.
Рис. 16.11. Три уровня численности населения в общей цветовой теме
Стилевое оформление придает карте целостный внешний вид с хорошо различимыми группами.
Осветление темы
По умолчанию Pygal использует темные темы оформления. Для печати я осветлил стиль своих диаграмм при помощи класса LightColorizedStyle. Этот класс изменяет общую тему оформления диаграммы, включая фон и метки, а также цвета отдельных стран. Чтобы использовать его, сначала необходимо импортировать стиль:
from pygal.style import LightColorizedStyle
Затем вы сможете использовать LightColorizedStyle в программе:
wm_style = LightColorizedStyle
Однако этот класс не позволяет напрямую управлять используемым цветом, поэтому Pygal выбирает базовый цвет по умолчанию. Чтобы назначить цвет, используйте LightColorizedStyle в качестве базового стиля для RotateStyle. Импортируйте LightColorizedStyle и RotateStyle:
from pygal.style import LightColorizedStyle, RotateStyle
Создайте стиль с использованием RotateStyle, но передайте дополнительный аргумент base_style:
wm_style = RotateStyle('#336699', base_style=LightColorizedStyle)
В результате для карты используется светлая общая тема, но цвета стран выбираются на основе цвета, переданного в аргументе. При использовании этого стиля ваши диаграммы будут больше похожи на снимки экрана на иллюстрациях.