JSON 是一种轻量级的数据交换格式,采用完全独立于编程语言的文本格式来存储和表示数据。
import json
#将数据加载到一个列表中
filename = 'population_data.json'
with open(filename) as f:
pop_data = json.load(f)
#打印每个国家2010年的人口数量
for pop_dict in pop_data:
if pop_dict['Year'] == '2010':
country_name = pop_dict['Country Name']
population = pop_dict['Value']
print(country_name + ": " + population)
(1)、首先导入模块json,以便能正确加载文件中的数据;
(2)、将数据存储在pop_data中;
(3)、函数json.load()将数据转换为python能够处理的格式,上述代码中是一个列表;
(4)、遍历pop_data中的每个元素。每个元素都是一个字典,包含四个键—值对,将每个字典依次存储在pop_dict中。
(5)、使用if语句获取我们需要得到的数据。
population = int(float(pop_dict['Value']))
print(country_name + ": " + str(population))
函数int()将字符串转化为整数值,
当遇到小数值时,会出现程序错误,
此时我们可以先将字符串使用函数float()转化为浮点数,再使用int()将浮点数转换为整数。
from pygal_maps_world.i18n import COUNTRIES
for country_code in sorted(COUNTRIES.keys()):
print(country_code,COUNTRIES[country_code])
Pygal使用的国别码存储在模块i18n,
字典COUNTRIES包含的键和值分别为两个字母的国别码和国家名。
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 None
print(get_country_code('Andorra'))
print(get_country_code('United Arab Emirates'))
print(get_country_code('Afghanistan'))
#打印每个国家2010年的人口数量
for pop_dict in pop_data:
if pop_dict['Year'] == '2010':
country_name = pop_dict['Country Name']
population = int(float(pop_dict['Value']))
code = get_country_code(country_name)
if code:
print(code + ": " + str(population))
else:
print('ERROR-' + country_name)
然后就可以打印国别码和人口数量了。
import pygal_maps_world.maps
wm = pygal_maps_world.maps.World()
wm.title = 'North,Central,and South America'
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')
(1)、创建一个World实例,并设置该地图的title属性;
(2)、使用方法add(),它接受一个标签和一个列表,列表中包括我们要突出的国家的国别码,每次调用add()都会选择一个新颜色;
(3)、方法render_to_file()创建一个包含该图表的.svg文件。
import pygal_maps_world.maps
wm = pygal_maps_world.maps.World()
wm.title = 'Populations of Countries in North America'
wm.add('North America',{'ca':34126000,'us':309349000,'mx':113423000})
wm.render_to_file('na_populations.svg')
这个字典将两个字母的Pygal国别码作为键,将人口数量作为值。
#创建一个包含人口数量的字典
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']))
code = get_country_code(country_name)
if code:
cc_populations[code] = population
wm = pygal_maps_world.maps.World()
wm.title = 'World Population in 2010,by Country'
wm.add('2010',cc_populations)
wm.render_to_file('world_population.svg')
(1)、首先创建一个空字典;
(2)、然后在循环中将要导入的值添加到空字典中;
(3)、在add()函数中引入前面创建的空字典。
# 根据人口数量将所有的国家分成三组
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))
wm = pygal_maps_world.maps.World()
wm.title = 'World Population in 2010,by Country'
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')
from pygal.style import RotateStyle
...
wm_style = RotateStyle('#336699')
wm = pygal_maps_world.maps.World(style=wm_style)
wm.title = 'World Population in 2010,by Country'
Pygal样式存储在模块style中,我们从这个模块中导入了样式RotateStyle,创建这个类的实例时,需要提供一个实参——十六进制的RGB颜色。
十六进制格式的RGB颜色是一个以井号(#)打头的字符串,后面跟着6个字符,其中前两个字符表示红色分量,接下来的两个表示绿色分量,最后两个表示蓝色分量。
hex color chooser(十六进制颜色选择器),可找到让你能够尝试选择不同的颜色并显示其RGB值的工具。
from pygal.style import LightColorizedStyle,RotateStyle
...
wm_style = RotateStyle('#336699',base_style=LightColorizedStyle)