1.世界人口地图介绍
本程序将从一个人口数据集中提取出每个国家2010年的人口数量,然后利用Pygal中的地图制作工具,将其展示在地图上。
本程序将使用population_data.json文件,它包含全球大部分国家1960~2010年的人口数据,来源:https://ehmatthes.github.io/pcc/
2.获取两个字母的国别码
Pygal中的地图制作工具要求数据为特定的格式:用国别码表示国家,以及用数字表示人口数量。population_data.json中包含的是三个字母的国别码,但Pygal使用两个字母的国别码。因此,这里使用get_country_code(country_name)方法,来根据国家名获取两个字母的国别码。
from pygal_maps_world.i18n import COUNTRIES
def get_country_code(country_name):
"""根据指定的国家,返回Pygal使用的两个字母的国别码"""
for code, name in COUNTRIES.items():
if name == country_name:
return code
# 如果没有找到指定的国家,就返回None
return None
3.制作世界地图
Pygal提供了图表类型Worldmap ,可帮助制作呈现各国数据的世界地图。
import json
import pygal
from country_code import get_country_code
# 将数据集加载到一个列表中
filename = 'population_data.json'
with open(filename) as file:
pop_data = json.load(file)
# 创建一个包含人口数量的字典
cc_populations = {}
for pop_dict in pop_data:
if pop_dict["Year"] == '2010':
country_name = pop_dict["Country Name"]
# 个别人口数据包含小数点,因此先将其转换为浮点数,再将浮点数转换为整数
population = int(float(pop_dict["Value"]))
code = get_country_code(country_name)
if code:
cc_populations[code] = population
# 根据人口数量将所有的国家分成三组
cc_pop_1, cc_pop_2, cc_pop_3 = {}, {}, {}
for cc, pop in cc_populations.items():
if pop < 10000000:
cc_pop_1[cc] = pop
elif pop < 1000000000:
cc_pop_2[cc] = pop
else:
cc_pop_3[cc] = pop
# 创建世界人口地图
wm_style = pygal.style.RotateStyle('#336699') # 让地图的颜色更一致,也更容易区分不同的编组
wm = pygal.maps.world.World(style=wm_style)
wm.title = "World Population in 2010, by Country"
wm.add('0-10m', cc_pop_1)
wm.add('10m-1bn', cc_pop_2)
wm.add('>1bn', cc_pop_3)
wm.render_to_file("world_population_2010.svg")