在《Pygal制作地图》的文章中,可以通过不同的方式显示数据,不过数据量偏小,如果想要显示大显的数据,我们可以通过JSON文件读取数据并显示在交互性地图上。
代码如下:
import json
import pygal
from pygal_maps_world.i18n import COUNTRIES
# 得到Country Code
def get_country_code(country_name):
for code, name in COUNTRIES.items():
if name == country_name:
return code
return None
# 读取JSON数据
filename = 'population_data.json'
with open(filename) as f:
pop_data = json.load(f)
# 得到字典文件显示格式是 "cn": 1331380000
poplist = {}
for pop_dict in pop_data:
if pop_dict['Year'] == '2009':
country_name = pop_dict['Country Name']
population = int(float(pop_dict['Value']))
code = get_country_code(country_name)
if code:
poplist[code] = population
# 显示数据
wm = pygal.maps.world.World()
wm.title = '2010 World Population'
wm.add('2010', poplist)
wm.render_to_file('world.svg')
所有的国家显示一种颜色没有分组,效果不是很好。如果根据人口数量的不同进行分组,则可以有更好的交互性。
改动的代码如下:
#根据人口数量将所有的国家按人口数量分组分组
poplist1, poplist2, poplist3 = {}, {}, {}
for c, p in poplist.items():
if p < 10000000:
poplist1[c] = p
elif p < 100000000:
poplist2[c] = p
else:
poplist3[c] = p
# 显示数据
wm = pygal.maps.world.World()
wm.title = '2010 World Population'
# wm.add('2010', poplist)
wm.add('0-10m', poplist1)
wm.add('10m-1bn', poplist2)
wm.add('>1bn', poplist3)
wm.render_to_file('world.svg')