Python数据可视化工具matplotlib的学习笔记(五)-JSON文件

(2020.03.29)

JSON 是一种轻量级的数据交换格式,采用完全独立于编程语言的文本格式来存储和表示数据。

  • 打印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包含的键和值分别为两个字母的国别码和国家名。

  • 编写一个函数并将其放在一个名为country_codes的模块中
    这个函数在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'))
  • 将上面的函数引入到world_population.py中
#打印每个国家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)

然后就可以打印国别码和人口数量了。

  • 制作世界地图
    制作地图使用pygal中的pygal_maps_world.maps
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文件

  • 在世界地图上呈现数字数据
    与上面示例的区别是 : 在方法add()中传递一个字典而不是列表。
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国别码作为键,将人口数量作为值。

  • 绘制完整的世界人口地图
    在导入json文件的那个程序中再导入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()函数中引入前面创建的空字典。

  • 有时候需要按照人口数量等一些条件分组
    可以使用for-elif-else代码块
# 根据人口数量将所有的国家分成三组
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')
  • 使用Pygal设置世界地图的样式
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值的工具。

  • 加亮颜色主题
    使用LightColorizedStyle加亮地图的颜色。
from pygal.style import LightColorizedStyle,RotateStyle
...
wm_style = RotateStyle('#336699',base_style=LightColorizedStyle)

你可能感兴趣的:(笔记)