1、環境信息python
python版本:2.7.13json
pygal版本:2.4.0瀏覽器
pygal安裝:pip install pygal 從python官方完整下載的最新的python版本自帶pipsvg
2、具體實現工具
一、下載數據網站
http://data.okfn.org/ spa
這個網站提供了大量能夠能夠無償使用的數據集,能夠從裏面下載。例如:https://datahub.io/JohnSnowLabs/population-figures-by-country 這個頁面就能夠下載各個國家和地區的從1960年開始的人口數據。code
此隨筆裏面所用數據我已傳到後臺,下載路徑爲:https://files.cnblogs.com/files/dbtd/population_data.rar ,下載後解壓的文件名稱爲population_data.jsonblog
二、獲取兩個字母的國別碼ip
Pygal的地圖製做工具要求數據爲特定的格式:用國別碼錶示國家(有幾種類型的國別碼,只要明白國別碼用來表示一個國家就能夠了,如CN表示中國),用數字表示人口。population_data.json中包含的是三個字母的國別碼,但Pygal使用兩個字母的國別碼。咱們須要把population_data.json裏面的國家數據轉換爲兩個字母的國別碼。代碼以下:
country_codes.py
# -*- 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是個字典,裏面存儲了國家名稱和兩位國別碼的對應關係,for code, name in COUNTRIES.items() 是對字典進行遍歷
三、繪製人口地圖
具體代碼以下:
world_population.py
# -*- coding: utf-8 -*- import json from country_codes import get_country_code from pygal.maps.world import World from pygal.style import RotateStyle, LightColorizedStyle with open('population_data.json') as f: pop_data = json.load(f) #加載json數據,變成了一個list country_population1 = {} country_population2 = {} country_population3 = {} for pop_dict in pop_data: if pop_dict['Year'] == '2010': country_name = pop_dict['Country Name'] country_code = get_country_code(country_name) population = pop_dict['Value'] #將國家進行分組:分爲小於一千萬,十億,大於十億 if country_code: if int(population) < 10000000: country_population1[country_code] = int(population) elif int(population) < 100000000: country_population2[country_code] = int(population) else: country_population3[country_code] = int(population) print len(country_population1), len(country_population2), len(country_population3) #查看每一個分組有多少個國家 wm_style = RotateStyle('#336699', base_style=LightColorizedStyle) wm = World(style=wm_style) wm.title = 'World Population in 2010, by Country' wm.add('0-10m', country_population1) wm.add('10m-1bn', country_population2) wm.add('>1bn', country_population3) wm.render_to_file('world_population.svg') #保存爲svg文件,能夠直接用瀏覽器打開
簡單說明:
①首先將json文件裏面的人口數據使用json庫整理,變成了一個list。 而後定義三個字典,分別用於存儲人口小於一千萬,大於一千萬少於十億,大於十億的國家數據。 這裏只繪製2010年國家人口地圖。
② RotateStyle是pygal裏面的樣式。建立這個類的實例時,須要提供一個實參 —— 十六進制的 RGB 顏色。十六進制格式 的 RGB 顏色是一個以井號( # )打頭的字符串,後面跟着 6 個字符,其中前兩個字符表示紅色份量,接下來的兩個表示綠色份量,最後兩個表示藍色份量。每一個份量的取值範圍爲 00 (沒有相應的顏色) ~FF (包含最多的相應顏色)。若是你在線搜索 hex color chooser ( 十六進制顏色選擇器 ),可找到讓你可以嘗試選擇不一樣的顏色並顯示其 RGB 值的工具。這裏使用的顏色值( #336699 )混合了少許的紅色( 33 )、多一些的綠色( 66 )和更多一些的藍色( 99 ),它爲 RotateStyle 提供了一種淡藍色基色。
③Pygal 一般默認使用較暗的顏色主題。使用 LightColorizedStyle 加亮了地圖的顏色。
④wm.title:設置圖表標題。 wm.add:它接受一個標籤和一個字典(列表)。每次調用 add() 都將爲指定的國家分組選擇一種新顏色,並在圖表左邊顯示該顏色和指定的標籤。
如也能夠這樣使用wm.add(標籤和list)
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'])
⑤render_to_file() 建立一個包含該圖表的 .svg 文件,svg文件能夠直接使用瀏覽器打開。打開後圖表以下: