前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于“Python”的核心知识点整理大全48

关于“Python”的核心知识点整理大全48

作者头像
用户10920956
发布2024-01-19 09:15:27
1520
发布2024-01-19 09:15:27
举报
文章被收录于专栏:lzylzy
代码语言:javascript
复制
from pygal.i18n import COUNTRIES
1 def get_country_code(country_name):
 """根据指定的国家,返回Pygal使用的两个字母的国别码"""
3 for code, name in COUNTRIES.items():
 if name == country_name:
 return code
 # 如果没有找到指定的国家,就返回None
4 return None 
print(get_country_code('Andorra'))
print(get_country_code('United Arab Emirates'))
print(get_country_code('Afghanistan')) 

get_country_code()接受国家名,并将其存储在形参country_name中(见1)。接下来,我们 遍历COUNTRIES中的国家名—国别码对(见2);如果找到指定的国家名,就返回相应的国别码(见 3)。在循环后面,我们在没有找到指定的国家名时返回None(见4)。最后,我们使用了三个国 家名来调用这个函数,以核实它能否正确地工作。与预期的一样,这个程序输出了三个由两个字 母组成的国别码:

代码语言:javascript
复制
ad
ae
af 

使用这个函数前,先将country_codes.py中的print语句删除。 接下来,在world_population.py中导入get_country_code: world_population.py

代码语言:javascript
复制
import json
from country_codes import get_country_code
--snip--
# 打印每个国家2010年的人口数量
for pop_dict in pop_data:
 if pop_dict['Year'] == '2010':
 country_name = pop_dict['Country Name']
 population = int(float(pop_dict['Value']))
1 code = get_country_code(country_name)
 if code:
2 print(code + ": "+ str(population))
3 else:
 print('ERROR - ' + country_name) 

提取国家名和人口数量后,我们将国别码存储在code中,如果没有国别码,就在其中存储None (见1)。如果返回了国别码,就打印国别码和相应国家的人口数量(见2)。如果没有找到国别 码,就显示一条错误消息,其中包含无法找到国别码的国家的名称(见3)。如果你运行这个程 序,将看到一些国别码和相应国家的人口数量,还有一些错误消息:

代码语言:javascript
复制
ERROR - Arab World
ERROR - Caribbean small states
ERROR - East Asia & Pacific (all income levels)
--snip--
af: 34385000
al: 3205000
dz: 35468000
--snip
ERROR - Yemen, Rep.
zm: 12927000
zw: 12571000

导致显示错误消息的原因有两个。首先,并非所有人口数量对应的都是国家,有些人口数量 对应的是地区(阿拉伯世界)和经济类群(所有收入水平)。其次,有些统计数据使用了不同的 完整国家名(如Yemen, Rep.,而不是Yemen)。当前,我们将忽略导致错误的数据,看看根据成 功恢复了的数据制作出的地图是什么样的。

16.2.5 制作世界地图

有了国别码后,制作世界地图易如反掌。Pygal提供了图表类型Worldmap,可帮助你制作呈现 各国数据的世界地图。为演示如何使用Worldmap,我们来创建一个突出北美、中美和南美的简单 地图: americas.py

代码语言:javascript
复制
import pygal
1 wm = pygal.Worldmap()
wm.title = 'North, Central, and South America'
2 wm.add('North America', ['ca', 'mx', 'us'])
wm.add('Central America', ['bz', 'cr', 'gt', 'hn', 'ni', 'pa', 'sv'])
wm.add('South America', ['ar', 'bo', 'br', 'cl', 'co', 'ec', 'gf',
 'gy', 'pe', 'py', 'sr', 'uy', 've'])

3 wm.render_to_file('americas.svg')

在1处,我们创建了一个Worldmap实例,并设置了该地图的的title属性。在2处,我们使用 了方法add(),它接受一个标签和一个列表,其中后者包含我们要突出的国家的国别码。每次调 用add()都将为指定的国家选择一种新颜色,并在图表左边显示该颜色和指定的标签。我们要以 同一种颜色显示整个北美地区,因此第一次调用add()时,在传递给它的列表中包含'ca'、'mx' 和'us',以同时突出加拿大、墨西哥和美国。接下来,对中美和南美国家做同样的处理。 3处的方法render_to_file()创建一个包含该图表的.svg文件,你可以在浏览器中打开它。输 出是一幅以不同颜色突出北美、中美和南美的地图,如图16-7所示。

知道如何创建包含彩色区域、颜色标示和标签的地图后,我们在地图中添加数据,以显示有 关国家的信息。

16.2.6 在世界地图上呈现数字数据

为练习在地图上呈现数字数据,我们来创建一幅地图,显示三个北美国家的人口数量: na_populations.py

代码语言:javascript
复制
import pygal
wm = pygal.Worldmap()
wm.title = 'Populations of Countries in North America'
1 wm.add('North America', {'ca': 34126000, 'us': 309349000, 'mx': 113423000})
wm.render_to_file('na_populations.svg')

首先,创建了一个Worldmap实例并设置了标题。接下来,使用了方法add(),但这次通过第 二个实参传递了一个字典而不是列表(见1)。这个字典将两个字母的Pygal国别码作为键,将人 口数量作为值。Pygal根据这些数字自动给不同国家着以深浅不一的颜色(人口最少的国家颜色 最浅,人口最多的国家颜色最深),如图16-8所示。

这幅地图具有交互性:如果你将鼠标指向某个国家,将看到其人口数量。下面在这个地图中 添加更多的数据。

16.2.7 绘制完整的世界人口地图

要呈现其他国家的人口数量,需要将前面处理的数据转换为Pygal要求的字典格式:键为两 个字母的国别码,值为人口数量。为此,在world_population.py中添加如下代码: world_population.py

代码语言:javascript
复制
import json
import pygal
from country_codes import get_country_code
# 将数据加载到列表中
--snip--
# 创建一个包含人口数量的字典
1 cc_populations = {}
for pop_dict in pop_data:
 if pop_dict['Year'] == '2010':
 country = pop_dict['Country Name']
 population = int(float(pop_dict['Value']))
 code = get_country_code(country)
 if code:
2 cc_populations[code] = population
3 wm = pygal.Worldmap()
wm.title = 'World Population in 2010, by Country'
4 wm.add('2010', cc_populations)
wm.render_to_file('world_population.svg') 

我们首先导入了pygal。在1处,我们创建了一个空字典,用于以Pygal要求的格式存储国别 码和人口数量。在2处,如果返回了国别码,就将国别码和人口数量分别作为键和值填充字典 cc_populations。我们还删除了所有的print语句。 在3处,我们创建了一个Worldmap实例,并设置其title属性。在4处,我们调用了add(), 并向它传递由国别码和人口数量组成的字典。图16-9显示了生成的地图。

有几个国家没有相关的数据,我们将其显示为黑色,但对于大多数国家,都根据其人口数量 进行了着色。本章后面将处理数据缺失的问题,这里先来修改着色,以更准确地反映各国的人口 数量。在当前的地图中,很多国家都是浅色的,只有两个国家是深色的。对大多数国家而言,颜 色深浅的差别不足以反映其人口数量的差别。为修复这种问题,我们将根据人口数量将国家分组, 再分别给每个组着色。

16.2.8 根据人口数量将国家分组

印度和中国的人口比其他国家多得多,但在当前的地图中,它们的颜色与其他国家差别较小。 中国和印度的人口都超过了10亿,接下来人口最多的国家是美国,但只有大约3亿。下面不将所 有国家都作为一个编组,而是根据人口数量分成三组——少于1000万的、介于1000万和10亿之间 的以及超过10亿的: world_population.py

代码语言:javascript
复制
--snip--
# 创建一个包含人口数据的字典
cc_populations = {}
for pop_dict in pop_data:
 if pop_dict['Year'] == '2010':
 --snip--
 if code:
 cc_populations[code] = population
# 根据人口数量将所有的国家分成三组
1 cc_pops_1, cc_pops_2, cc_pops_3 = {}, {}, {}
2 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
# 看看每组分别包含多少个国家
3 print(len(cc_pops_1), len(cc_pops_2), len(cc_pops_3))
wm = pygal.Worldmap()
wm.title = 'World Population in 2010, by Country'
4 wm.add('0-10m', cc_pops_1)
wm.add('10m-1bn', cc_pops_2)
wm.add('>1bn', cc_pops_3)
wm.render_to_file('world_population.svg') 

为将国家分组,我们创建了三个空字典(见1)。接下来,遍历cc_populations,检查每个国 家的人口数量(见2)。if-elif-else代码块将每个国别码人口数量对加入到合适的字典 (cc_pops_1、cc_pops_2或cc_pops_3)中。 在3处,我们打印这些字典的长度,以获悉每个分组的规模。绘制地图时,我们将全部三个 分组都添加到Worldmap中(见4)。如果你现在运行这个程序,首先看到的将是每个分组的规模:

代码语言:javascript
复制
85 69 2

上述输出表明,人口少于1000万的国家有85个,人口介于1000万和10亿之间的国家有69个,还有两个国家比较特殊,其人口都超过了10亿。这样的分组看起来足够了,让地图包含丰富的信 息。图16-10显示了生成的地图。

现在使用了三种不同的颜色,让我们能够看出人口数量上的差别。在每组中,各个国家都按 人口从少到多着以从浅到深的颜色。

16.2.9 使用 Pygal 设置世界地图的样式

在这个地图中,根据人口将国家分组虽然很有效,但默认的颜色设置很难看。例如,在这里, Pygal选择了鲜艳的粉色和绿色基色。下面使用Pygal样式设置指令来调整颜色。 我们也让Pygal使用一种基色,但将指定该基色,并让三个分组的颜色差别更大: world_population.py

代码语言:javascript
复制
import json
import pygal
1 from pygal.style import RotateStyle
--snip--
# 根据人口数量将所有的国家分成三组
cc_pops_1, cc_pops_2, cc_pops_3 = {}, {}, {}
for cc, pop in cc_populations.items():
 if pop < 10000000:
 --snip-- 
2 wm_style = RotateStyle('#336699')
3 wm = pygal.Worldmap(style=wm_style)
wm.title = 'World Population in 2010, by Country'
--snip-- 
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-12-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 16.2.5 制作世界地图
  • 16.2.6 在世界地图上呈现数字数据
  • 16.2.7 绘制完整的世界人口地图
  • 16.2.8 根据人口数量将国家分组
  • 16.2.9 使用 Pygal 设置世界地图的样式
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档