您的位置:首页 > 编程语言 > Python开发

制作世界人口地图

2018-03-25 18:41 501 查看
我们将使用Python中的Pygal库来制作世界人口地图
下面是用到的资源和代码 点击打开链接 密码:keyx
下面是操作步骤
绘制世界人口地图
1.使用Pygal地图创建工具对人口数据进行可视化,以探索全球人口的分布情况
population_
4000
data.json是一个json文件,里面有一个很长的Python列表
其中每个元素都是一个包含四个键的字典:国家名 国别码 年份 人口数量
下面是world_population.py代码
import json
from country_code import get_country_code
# 将数据加载到一个列表中 
filename = "population_data.json"
with open(filename) as f:
# 函数json.load()将数据转换为Python能够处理的格式
pop_data = json.load(f)
for pop_dict in pop_data:
if pop_dict['Year'] == '2010':
country_name = pop_dict['Country Name']
population = int(float(pop_dict['Value']))
# print(country_name + ": " + str(population))
# print(country_name + ": " + population)
'''
导致错误的消息有两个原因: 并非所有人口数量对应的都是国家,
也可能是地区和经济类群。 有些数据使用了不完整的国家名
'''
code  = get_country_code(country_name)
if code:
print(code + ": " + str(population))
else:
print("ERROR - " + country_name)
打印出来的数据是
...
ERROR - Pacific island small states
ERROR - Small states
ERROR - South Asia
ERROR - Sub-Saharan Africa (all income levels)
ERROR - Sub-Saharan Africa (developing only)
ERROR - Upper middle income
ERROR - World
af: 34385000
al: 3205000
dz: 35468000
ERROR - American Samoa
ad: 84864
......
我们要将字符串转化成数字值方便pygal处理
但是int()不能转化带小数点的字符串
int('589011025.857512') 会出现ValueError异常
因此我们用int(float('589011025.857512'))

2. 创建countries.py country_code.py获取两个字母的国别码

3. 制作一个简单的世界地图americas.py

4. 在世界地图上呈现数据na_populations.py

5.绘制完整的世界人口地图 
要呈现其他国家的人口数量,需要将前面的数据转换为Pygal要求的字典格式:
键为两个字母的国别码, 值为人口数量 
下来我们修改world_population.py

6..可以看出步骤4图中只有中国和印度人口是红色的,其他的颜色区分并不明显 因此
我们将根据人口数量将国家分组,再分别给每个组着色
接下来根据人口数量分成三组(少于1000万的,介于1000万到10亿之间,超过十亿的)

7.让地图的颜色更加一致,更容易区分不同组

使用pygal.style中的RotateStyle
world_population.pyimport json

from country_code import get_country_code

import pygal.maps.world
from pygal.style import RotateStyle, LightColorizedStyle, RotateStyle

# 将数据加载到一个列表中
filename = "population_data.json"
with open(filename) as f:
# 函数json.load()将数据转换为Python能够处理的格式
pop_data = json.load(f)

# 包含人口数量的字典
cc_populations = {}
for pop_dict in pop_data:
if pop_dict['Year'] == '2010':
country_name = pop_dict['Country Name']
population = int(float(pop_dict['Value']))
# print(country_name + ": " + str(population))
# print(country_name + ": " + population)

'''
导致错误的消息有两个原因: 并非所有人口数量对应的都是国家,
也可能是地区和经济类群。 有些数据使用了不完整的国家名
'''
code = get_country_code(country_name)
if code:
cc_populations[code] = population

# 根据人口数量将所有的国家分成三组
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

# 看看每组分别包含多少个国家
print(len(cc_pops_1), len(cc_pops_2), len(cc_pops_3))

# base_style使用较亮的主体
wm_style = RotateStyle("#336688", base_style = LightColorizedStyle)
wm = pygal.maps.world.World(style = wm_style)

wm.title = 'World Population in 2010, by Country'
# wm.add('2010', cc_populations)
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')countries.py"""
Pygal中的地图制作工具要求数据为特定的格式: 用国别码表示国家
,以用数字表示人口数量。 papulation_data.json中的国别码是三个
字母,因此不能使用。 Pygal使用的国别码存储在pygal.i18n模块中
(internationalization的缩写)
需要注意的是,现在已经没有pygal.i18n模块了
因此需要使用pip install pygal_maps_world 用这个模块中的就可以了
关于Python基础知识我是不想讲的,但是害怕新手看不懂我就带着大家看文档
刚好我也复习一下
COUNTRIES是一个字典,键是国别码,值是国家名
sorted(iterable, [, key], [, reverse])
Return a new sorted list from the items in iterable.
注意这里是返回一个排序好了的列表,并不改变iterable,和list.sort()方法不一样偶
key specifies a function of one argument that is used to extract a comparison
key form each list element. The default value is None.(compare the elements directly)
reverse is a boolean value If set to True, then the list elements are sorted as if each
comparion were reversed.
也就是说key指定一个接受一个参数的函数,这个函数用于从每个元素中提取一个用于比较的关键字。默认值为None
key你传入函数名就好了(函数地址) reverse默认是False,从小到大排序(字符串的话第一个字母的ASCILL)
True就是从到小排序
"""
from pygal_maps_world.i18n import COUNTRIES

for country_code in sorted(COUNTRIES.keys()):
print(country_code, COUNTRIES[country_code])americans.py"""
Pygal提供了图表类型Worldmap,我们先举一个简单突出北美、中美和
南美的简单地图
"""
import pygal.maps.world

wm = pygal.maps.world.World()
wm.title = "North, Central, and South America"

# 每次调用add()方法都将为指定的国家选择一种颜色
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'])

wm.render_to_file('americas.svg')country_code.py"""编写一个函数,传入国家名,返回二个字母的国别码
"""

from pygal_maps_world.i18n import COUNTRIES

def get_country_code(country_name):
"""根据指定的国家,返回pygal使用的两个字母的国别码"""
for code, name in COUNTRIES.items():
if name == country_name:
return code
# 没有找到返回None
return Nonena_populations.py"""
为了在地图上呈现数字数据,创建一幅地图,显示三个北美国家的人口数量
"""
import pygal.maps.world

wm = pygal.maps.world.World()
wm.title = "Populations of Countries in North America"
# 第二个实参传递了一个字典而不是列表 pygal会根据数据自动给不同国家以深浅不一样的颜色
wm.add("North America", {'ca' : 34126000, 'us' : 309349000, 'mx' : 113423000})

wm.render_to_file('na_population.svg')步骤1图片



步骤4图片



步骤5:



步骤6:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息