天天看点

Pygal之世界地图绘制from pygal.i18n import COUNTRIES 报错的解决办法

大胆尝试乃是解决debug的关键!尤其是掌握的信息不足的时候,大胆尝试可以节省半天的时间,免去debug纠结之苦。

首先展示一下本文的成果,以佐证文章的真实可靠。结果如下图:

Pygal之世界地图绘制from pygal.i18n import COUNTRIES 报错的解决办法
注意:pygal为web交互式插件,因此需要联网!

问题描述:

在学习《python编程:从入门到精通》的pygal绘制世界地图时,遇到了这样一个问题:

运行程序报错,提示模型不存在,出错代码如下:

from pygal.i18n import COUNTRIES 
           

查阅pygal文档可知,这个模块已被遗弃,使用新的map包,地图绘制命令变为:

wm = pygal.maps.world.World()
           

解决办法:

在Anaconda的Anaconda prompt中输入命令:

pip install pygal_maps_world

安装包,由于我已安装了此包,所以再次执行安装将出现下图所示内容:

Pygal之世界地图绘制from pygal.i18n import COUNTRIES 报错的解决办法

然后,导入文件修改相应代码即可。此包导入命令如下:

最后,贴出完整代码(python采用缩进格式,一定合理缩进代码):

文件country_codes.py代码:

import pygal.maps.world  # 导入世界地图包pygal_maps_world

# 定义函数,返回适用于pygal的两位国别码
def get_country_code(country_name):
     # pygal两位国别码列表表示法:pygal.maps.world.COUNTRIES.items()
    for code,name in pygal.maps.world.COUNTRIES.items():
        if name == country_name:
            return code
    return None
           

文件 country_codes.py代码如下:

import json
import pygal.maps.world   # 导入世界地图绘制包,用于绘制地图
from country_codes import get_country_code    # 导入国别码识别包

# 读取数据文件population_data.json(不知哪儿可以加载数据文件,需要的可以留言)
filename = 'population_data.json'  
with open(filename) as f:
    pop_data = json.load(f)  # 将json格式转换为python识别格式

cc_populations = {}   # 用于存储人口数据
for pop_dict in pop_data:
    if pop_dict['Year'] == '2010':   # 提取2010年的数据
        country_name = pop_dict['Country Name']
        # 将格式不统一的人口数据转换为浮点型,再转换为int型统一格式,供pygal绘图使用
        population =int(float( pop_dict['Value'])) 
        code = get_country_code(country_name)
        # 按国别码提取正确的国家和对应人口数据
        if code:
            cc_populations[code]=population

#根据人口数量将国家分成三组,0-1千万,1千万-10亿,10亿以上
cc_pops_1,cc_pops_2,cc_pops_3 = {},{},{}
for cc,pop in cc_populations.items():
    if pop < :
        cc_pops_1[cc] = pop
    elif pop < :
        cc_pops_2[cc] = pop
    else:
        cc_pops_3[cc] = pop

wm = pygal.maps.world.World()                        # 生成世界地图实例
wm.title = 'World Population in 2010, by Country'    # 设置标题
wm.add('1-10m',cc_pops_1)                            # 添加0——1千万的国家和人口
wm.add('10m-1bn',cc_pops_2)                          # 添加1千万——10亿的国家和人口
wm.add('>bn',cc_pops_3)                              # 添加10亿以上的国家和人口
wm.render_to_file('world_population.svg')            # 渲染视图到文件,通过浏览器可查看
           

将两个文件保存到同一目录,运行文件country_codes.py,以浏览器的方式打开world_population.svg文件,即可看到文章开头展示的图片内容。