python学习笔记之pygal可视化世界人口

数据可视化指的是通过可视化表示来探索数据,它与数据挖掘紧密相关,而数据挖掘指的是通过代码来探索数据集的规律及关联。漂亮地展示数据关乎的不仅仅是漂亮的图片。以引人入胜的简洁方式呈现数据,让观者明白其含义,发现数据中原本未意识到的规律与意义。
在这一领域,有更多人抛弃excel,matlab甚至是R语言选择用python来进行这些工作,究其原因,像我这种初学者看重其简洁,资源丰富的包,数据科学家们应该看重其开源的特性,可以更加自主的编写功能。
pygal包是专注于生成适合在数字设备上显示的图表,下面来使用它对2010年的世界人口进行可视化。
1.数据来源:
所需的数据可以在http://data.okfn.org/网站中下载,它里面有大量可供免费下载使用的数据,本项目所使用的数据下载地址为https://files.cnblogs.com/files/dbtd/population_data.rar ,解压后得到population_data.json文件,我们用记事本打开后发现它是python字典的表现形式,其中的键包括:Country Name,Country Code,Year,Value,其中Country Code对应国家的国别码,但json文件中使用的是3位国别码,但pygal使用的位2位国别码,所以需要使用一个自定义方法来进行转换,代码如下:

# -*- coding: utf-8 -*-
from pygal.maps.world import COUNTRIES
def get_country_code(country_name):
	for code,name in COUNTRIES.items():
		if name==country_name:
			return code
	return None

方法通过遍历COUNTRIES字典,以对应2位国别码和国家名。
2.下面是具体的世界地图的绘制,我们使用pip安装pygal_maps_world模块来进行地图绘制,下面是一个简单的示例:

import pygal.maps.world

worldmap_chart = pygal.maps.world.World()
worldmap_chart.title = 'Some countries'
worldmap_chart.add('F countries', ['fr', 'fi'])
worldmap_chart.add('M countries', ['ma', 'mc', 'md', 'me', 'mg',
                                   'mk', 'ml', 'mm', 'mn', 'mo',
                                   'mr', 'mt', 'mu', 'mv', 'mw',
                                   'mx', 'my', 'mz'])
worldmap_chart.add('U countries', ['ua', 'ug', 'us', 'uy', 'uz'])
worldmap_chart.render_to_file('bar_chart.svg')

这里使用World方法来进行世界地图的绘制,并将部分国别码首字母相同的国家标识为一类,效果图如下:
python学习笔记之pygal可视化世界人口地图示例
首先需要加载json文件,为方便区分,定义3个字典按照人口多少分为3个区间分别存储,对list进行遍历,因为网站的人口数据只提供到2010年,我们只分析这一年的数据,具体代码如下:

import requests
import pygal
import json
from pygal.maps.world import World
from pygal.style import RotateStyle, LightColorizedStyle as LCS
filename="population_data.json"
with open(filename)as f:
	pop_data=json.load(f)#加载json文件
c_population={}
for pop_dict in pop_data:
	if pop_dict['Year']=='2010':
		country_name = pop_dict['Country Name']
		code=get_country_code(country_name)#获取国别码
		population=int(float(pop_dict['Value']))将人口数转换为int型
		
		if code:
			c_population[code]=population
c_pops_1,c_pops_2,c_pops_3={},{},{}			
for cc,pop in c_population.items():
#按人口数分为3类
	if pop < 10000000:
		c_pops_1[cc] = pop
	elif pop < 1000000000:
		c_pops_2[cc] = pop
	else:
		c_pops_3[cc] = pop
			  	
print(len(c_pops_1),len(c_pops_2),len(c_pops_3))#打印不同区间国家数

map_style=RotateStyle('#336699',base_style=LCS)
maps=World(style=map_style)
maps.title='World Population IN2010,by country'
maps.add('0-10m',c_pops_1)
maps.add('10m-1bn',c_pops_2)
maps.add('>1bn',c_pops_3)
maps.render_to_file('world_population.svg')#保存为svg格式图片

注明:
(1) RotateStyle是pygal里面的样式。创建这个类的实例时,需要提供一个实参 —— 十六进制的 RGB 颜色。十六进制格式 的 RGB 颜色是一个以井号( # )打头的字符串,后面跟着 6 个字符,其中前两个字符表示红色分量,接下来的两个表示绿色分量,最后两个表示蓝色分量。每个分量的取值范围为 00 (没有相应的颜色) ~FF (包含最多的相应颜色)。如果你在线搜索 hex color chooser ( 十六进制颜色选择器 ),可找到让你能够尝试选择不同的颜色并显示其 RGB 值的工具。这里使用的颜色值( #336699 )混合了少量的红色( 33 )、多一些的绿色( 66 )和更多一些的蓝色( 99 ),它为 RotateStyle 提供了一种淡蓝色基色。

(2)Pygal 通常默认使用较暗的颜色主题。使用 LightColorizedStyle 加亮了地图的颜色。
生成的图片如下:
python学习笔记之pygal可视化世界人口
最终结果(每次调用add都会为指定分组国家指定一种新颜色)