1. 程式人生 > >python學習筆記之pygal視覺化世界人口

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方法來進行世界地圖的繪製,並將部分國別碼首字母相同的國家標識為一類,效果圖如下:
在這裡插入圖片描述地圖示例
首先需要載入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']))將人口數轉換為intif 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 加亮了地圖的顏色。
生成的圖片如下:
在這裡插入圖片描述
最終結果(每次呼叫add都會為指定分組國家指定一種新顏色)