Pygal之世界地图绘制from pygal.i18n import COUNTRIES 报错的解决办法
在《Python编程:从入门到实践》书中的一个项目用到pygal.i18n
获取国别码,
问题描述:
在学习《python编程:从入门到精通》的pygal绘制世界地图时,遇到了这样一个问题:
运行程序报错,提示模型不存在,出错代码如下:
from pygal.i18n import COUNTRIES
1
查阅pygal文档可知,这个模块已被遗弃,使用新的map包,地图绘制命令变为:
wm = pygal.maps.world.World()
1
解决办法:
在Anaconda的Anaconda prompt中输入命令:pip install pygal_maps_world 安装包,
然后,导入文件修改相应代码即可。此包导入命令如下:
import pygal.maps.world
1
最后,贴出完整代码(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 < 10000000:
cc_pops_1[cc] = pop
elif pop < 1000000000:
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文件,即可看到文章开头展示的图片内容。
相关文章
- linux git 报错提示 fatal: 'origin' does not appear to be a git repository 解决办法
- 单元测试时候使用[ClassInitialize]会该方法必须是静态的公共方法,不返回值并且应采用一个TestContext类型的参数报错的解决办法
- CentOs6 yum源 centos/6.4/os/x86_64/repodata/repomd.xml报错的解决方法
- IDEA的SonarLint插件报错Unable to create symbol table for
- vss报错Workgroup无法访问,您可能没有权限使用网络资源解决办法
- jenkins pipeline发送邮件报错解决办法: failed to connect, no password specified?
- npm无法安装node-sass报错提示安装:npm rebuild node-sass却安装不了的解决办法
- Android报错:IllegalStateException: The specified child already has a parent问题解决办法
- 【错误记录】Android Gradle 配置报错 ( gradle.properties 配置到 BuildConfig 中需要注意类型转换 | 位置: 类 BuildConfig )
- vue3 报错解决:找不到模块‘xxx.vue’或其相应的类型声明。(Vue 3 can not find module)
- 理解和解决requireJS的报错:MODULE NAME HAS NOT BEEN LOADED YET FOR CONTEXT
- Docker pull拉取镜像报错“Error response from daemon: Get “https://registry-1.docker.io/v2”解决办法
- 编译u-boot 报错 openssl/evp.h: No such file or directory
- emacs之coding UTF-8 保存报错(三十三)
- linux 启动network后报错:device eth0 does not seem to be present, delaying initialization
- linux===启动sdk manager下载配置sdk的时候报错的解决办法
- appium===报错Failure [INSTALL_FAILED_ALREADY_EXISTS: Attempt to re-install io.appium.settings without first uninstalling.的解决办法
- C语言----Visual Studio 2017中使用scanf报错的解决办法
- 【异常】IDEA中报错,提示java: 警告: 源发行版 11 需要目标发行版 11
- 开发报错记录解决(三):编译python出现“SyntaxError: Non-UTF-8 code starting with ‘xcc‘ in file D”的统一解决办法
- Androidstudio报错:Could not find method androidTestCompile()
- 解决Eclipse报错:the file dx.jar was not loaded from the SDK
- Invoke-Command 执行报错:解决方法