程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

python數據可視化繪制世界人口地圖

編輯:Python

目錄

前言

獲取兩個字母的國別碼

制作世界地圖

繪制完整的世界人口地圖

根據人口數量將國家分組

根據Pygal設置世界地圖的樣式

前言

數據來源:population_data.json,

先看一下數據長啥樣

[ { "Country Name": "Arab World", "Country Code": "ARB", "Year": "1960", "Value": "96388069" }, { "Country Name": "Arab World", "Country Code": "ARB", "Year": "1961", "Value": "98882541.4" },省略。。。。]

'''這個文件實際上就是一個很長的Python列表,其中每個元素都是一個包含四個鍵的字典:
國家名、國別碼、年份以及表示人口數量的值。

我們只關心每個國家2010年的人口數量,因此我們首先編寫一個打印這些信息的程序:'''

import json#將數據加載到一個列表中filename= 'population_data.json'with open(filename) as f : pop_data = json.load(f)#打印每個國家2010年的人口數量for pop_dic in pop_data : if pop_dic["Year"] == '2010' : country_name= pop_dic['Country Name'] population =int(float(pop_dic['Value']) )#population_data.json中的每個鍵和值都是字符串。為處理這些人口數據,我們需要將表示人口數量的字符串轉換為數字值,為此我們使用函數int(): print(country_name + ":" + str(population))rab World:357868000Caribbean small states:6880000East Asia & Pacific (all income levels):2201536674East Asia & Pacific (developing only):1961558757Euro area:331766000Europe & Central Asia (all income levels):890424544Europe & Central Asia (developing only):405204000獲取兩個字母的國別碼

'''制作地圖前,還需要解決數據存在的最後一個問題。Pygal中的地圖制作工具要求數據為特定的格式:用國別碼表示國家,以及用數字表示人口數量。處理地理政治數據時,經常需要用到幾個標准化國別碼集。

population_data.json中包含的是三個字母的國別碼,但Pygal使用兩個字母的國別碼。我們需要想辦法根據國家名獲取兩個字母的國別碼。

Pygal使用的國別碼存儲在模塊i18n(internationalization的縮寫)中。

字典COUNTRIES包含的鍵和值分別為兩個字母的國別碼和國家名。

要查看這些國別碼,可從模塊i18n中導入這個字典,並打印其鍵和值:'''

from pygal_maps_world.i18n import COUNTRIESfor country_code in sorted(COUNTRIES.keys()): print(country_code, COUNTRIES[country_code])ad Andorraae United Arab Emiratesaf Afghanistanal Albania

為獲取國別碼,我們將編寫一個函數,它在COUNTRIES中查找並返回國別碼。

我們將這個函數放在一個名為country_codes的模塊中,以便能夠在可視化程序中導入它:

from pygal_maps_world.i18n import COUNTRIESdef get_country_code(country_name): #根據指定的國家,返回Pygal使用的兩個字母的國別碼 for code,name in COUNTRIES.items(): if name == country_name : return code # 如果沒有找到指定的國家,就返回None return None#打印每個國家2010年的人口數量for pop_dic in pop_data : if pop_dic["Year"] == '2010' : country_name= pop_dic['Country Name'] population =int(float(pop_dic['Value']) )#population_data.json中的每個鍵和值都是字符串。為處理這些人口數據,我們需要將表示人口數量的字符串轉換為數字值,為此我們使用函數int(): code = get_country_code(country_name) if code : print(code + ":" + str(population)) else: print('error - ' + ":" + str(population))error - :357868000error - :6880000error - :2201536674error - :1961558757error - :331766000

導致顯示錯誤消息的原因有兩個。首先,並非所有人口數量對應的都是國家,有些人口數量對應的是地區(阿拉伯世界)和經濟類群(所有收入水平)。

其次,有些統計數據使用了不同的完整國家名(如Yemen, Rep.,而不是Yemen)。當前,我們將忽略導致錯誤的數據,看看根據成功恢復了的數據制作出的地圖是什麼樣的。

制作世界地圖import pygal_maps_world.maps#創建了一個Worldmap實例,並設置了該地圖的的title屬性wm = pygal_maps_world.maps.World()wm.title = 'North, Central, and South America''''方法add(),它接受一個標簽和一個列表,其中後者包含我們要突出的國家的國別碼。每次調用add()都將為指定的國家選擇一種新顏色,並在圖表左邊顯示該顏色和指定的標簽。我們要以同一種顏色顯示整個北美地區,因此第一次調用add()時,在傳遞給它的列表中包含'ca'、'mx'和'us',以同時突出加拿大、墨西哥和美國。接下來,對中美和南美國家做同樣的處理。'''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文件,你可以在浏覽器中打開它。輸出是一幅以不同顏色突出北美、中美和南美的地圖'''wm.render_to_file('americas.svg')

繪制完整的世界人口地圖

'''要呈現其他國家的人口數量,需要將前面處理的數據轉換為Pygal要求的字典格式:鍵為兩個字母的國別碼,值為人口數量。

為此,在world_population.py中添加如下代碼:

import  json

#將數據加載到一個列表中filename= 'population_data.json'with open(filename) as f : pop_data = json.load(f)def get_country_code(country_name): #根據指定的國家,返回Pygal使用的兩個字母的國別碼 for code,name in COUNTRIES.items(): if name == country_name : return code # 如果沒有找到指定的國家,就返回None return None#創建一個包含人口數量是字典cc_populations = {}#打印每個國家2010年的人口數量for pop_dic in pop_data : if pop_dic["Year"] == '2010' : country_name= pop_dic['Country Name'] population =int(float(pop_dic['Value']) )#population_data.json中的每個鍵和值都是字符串。為處理這些人口數據,我們需要將表示人口數量的字符串轉換為數字值,為此我們使用函數int(): code = get_country_code(country_name) if code : cc_populations[code] = populationimport pygal_maps_world.maps#創建了一個Worldmap實例,並設置了該地圖的的title屬性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')

根據人口數量將國家分組import json#將數據加載到一個列表中filename= 'population_data.json'with open(filename) as f : pop_data = json.load(f)def get_country_code(country_name): #根據指定的國家,返回Pygal使用的兩個字母的國別碼 for code,name in COUNTRIES.items(): if name == country_name : return code # 如果沒有找到指定的國家,就返回None return None#創建一個包含人口數量是字典cc_populations = {}#打印每個國家2010年的人口數量for pop_dic in pop_data : if pop_dic["Year"] == '2010' : country_name= pop_dic['Country Name'] population =int(float(pop_dic['Value']) )#population_data.json中的每個鍵和值都是字符串。為處理這些人口數據,我們需要將表示人口數量的字符串轉換為數字值,為此我們使用函數int(): code = get_country_code(country_name) if code : cc_populations[code] = population###根據人口數量將國家分3組 cc_pop_1,cc_pop_2,cc_pop_3 = {},{},{}for cc,pop in cc_populations.items(): if pop < 10000000: cc_pop_1[cc] = pop elif pop < 1000000000: cc_pop_2[cc] = pop else: cc_pop_3[cc] = popimport pygal_maps_world.maps#創建了一個Worldmap實例,並設置了該地圖的的title屬性wm = pygal_maps_world.maps.World()wm.title = 'world population in 2010, by country'wm.add('0-10m', cc_pop_1)wm.add('10m-1bn', cc_pop_2)wm.add('> 1bn', cc_pop_3)wm.render_to_file('world_population.svg')

根據Pygal設置世界地圖的樣式

在這個地圖中,根據人口將國家分組雖然很有效,但默認的顏色設置很難看。例如,在這裡,Pygal選擇了鮮艷的粉色和綠色基色。

下面使用Pygal樣式設置指令來調整顏色。我們也讓Pygal使用一種基色,但將指定該基色,並讓三個分組的顏色差別更大

###根據Pygal設置世界地圖的樣式'''在這個地圖中,根據人口將國家分組雖然很有效,但默認的顏色設置很難看。例如,在這裡,Pygal選擇了鮮艷的粉色和綠色基色。下面使用Pygal樣式設置指令來調整顏色。我們也讓Pygal使用一種基色,但將指定該基色,並讓三個分組的顏色差別更大'''###根據人口數量將國家分組import json#將數據加載到一個列表中filename= 'population_data.json'with open(filename) as f : pop_data = json.load(f)def get_country_code(country_name): #根據指定的國家,返回Pygal使用的兩個字母的國別碼 for code,name in COUNTRIES.items(): if name == country_name : return code # 如果沒有找到指定的國家,就返回None return None#創建一個包含人口數量是字典cc_populations = {}#打印每個國家2010年的人口數量for pop_dic in pop_data : if pop_dic["Year"] == '2010' : country_name= pop_dic['Country Name'] population =int(float(pop_dic['Value']) )#population_data.json中的每個鍵和值都是字符串。為處理這些人口數據,我們需要將表示人口數量的字符串轉換為數字值,為此我們使用函數int(): code = get_country_code(country_name) if code : cc_populations[code] = population###根據人口數量將國家分3組 cc_pop_1,cc_pop_2,cc_pop_3 = {},{},{}for cc,pop in cc_populations.items(): if pop < 10000000: cc_pop_1[cc] = pop elif pop < 1000000000: cc_pop_2[cc] = pop else: cc_pop_3[cc] = popimport pygal_maps_world.maps#創建了一個Worldmap實例,並設置了該地圖的的title屬性from pygal.style import RotateStylefrom pygal.style import LightColorizedStyle#加亮顏色主題wm_style = RotateStyle('#336699', base_style= LightColorizedStyle)wm = pygal_maps_world.maps.World(style = wm_style)wm.title = 'world population in 2010, by country'wm.add('2010', cc_populations)wm.add('0-10m', cc_pop_1)wm.add('10m-1bn', cc_pop_2)wm.add('> 1bn', cc_pop_3)wm.render_to_file('world_population.svg')

以上就是python數據可視化繪制世界人口地圖的詳細內容,更多關於python繪制世界人口地圖的資料請關注軟件開發網其它相關文章!



  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved