搞技术就是修炼
请注意利用这种方法利用pygal绘制的全球地图中中国领土是有问题的,不包括香港、澳门,台湾三地。请大家谨慎使用。
经查证,pygal可视化包国别码COUNTRIES字典中是包含三地的,但将三地与中国大陆分开了,大陆部分为China,香港为Hong Kong,澳门为Macao,台湾为 Taiwan, Province of China。
而《Python编程 从入门到实践》这一本书中提供的世界人口数据中未找到台湾地区数据,且香港、澳门的名称与pygal中的名称不一致,无法将两文件内容相关联,所以在最终绘制的图中并不能显示三地的信息。
解决方案:修改json文件中香港澳门的名称与pygal中的名称相对应,即可显示。但由于未在json中找到台湾数据,无法与pygal中数据相关联。
显示pygal中国别码与国家
import pygal
from pygal_maps_world.i18n import COUNTRIES
for code in COUNTRIES.keys():
print(code,COUNTRIES[code])
程序
import json #导入json模块
from pygal_maps_world.i18n import COUNTRIES
import pygal
def get_countries_code(country_name):
"""
根据指定的国家,返回pygal使用的两个字母的国别码。
pygal模块中的制图工具要求数据为特定格式:用国别码表示国家,用数字数字表示人口数量
pygal的国别码储存pygal_maps_world.i18n模块中,字典COUNTRIES包含的键和值
分别为两个字母的国别码和国家名,需要提前导入。
"""
for code,name in COUNTRIES.items():
if name==country_name:
return code
return None #如果没有找到就返回None
#读取文件内容
filename='population_data.json'
with open(filename) as f:
countries_pops=json.load(f) #读取json文件中内容,放置在countries_pops字典中
cc_pops={}#创建一个包含国别码和人口的字典
for pop_dict in countries_pops:
if pop_dict['Year']=='2010':
country_name=pop_dict['Country Name']#获取国家名称
population=int(float(pop_dict['Value']))#获取人口
code=get_countries_code(country_name)
if code:
cc_pops[code]=population
# 将人口数量分为三组
cc_pop_1,cc_pop_2,cc_pop_3={},{},{}
for cc,pop in cc_pops.items():
if pop<10000000:#1000万=10m
cc_pop_1[cc]=pop
elif pop<1000000000:#10亿=1bn
cc_pop_2[cc]=pop
else:
cc_pop_3[cc]=pop
#看看每组分别包含多少国家
print(len(cc_pop_1),len(cc_pop_2),len(cc_pop_3))
wm=pygal.maps.world.World()#绘制全球地图
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_populatin.svg')#生成svg格式图件,可在浏览器中打开
svg格式可选择不同分类进行显示。