python數(shù)據(jù)可視化繪制世界人口地圖
前言
數(shù)據(jù)來(lái)源:population_data.json,
先看一下數(shù)據(jù)長(zhǎng)啥樣
[ { "Country Name": "Arab World", "Country Code": "ARB", "Year": "1960", "Value": "96388069" }, { "Country Name": "Arab World", "Country Code": "ARB", "Year": "1961", "Value": "98882541.4" }, 省略。。。。 ]
'''這個(gè)文件實(shí)際上就是一個(gè)很長(zhǎng)的Python列表,其中每個(gè)元素都是一個(gè)包含四個(gè)鍵的字典:
國(guó)家名、國(guó)別碼、年份以及表示人口數(shù)量的值。
我們只關(guān)心每個(gè)國(guó)家2010年的人口數(shù)量,因此我們首先編寫(xiě)一個(gè)打印這些信息的程序:'''
import json #將數(shù)據(jù)加載到一個(gè)列表中 filename= 'population_data.json' with open(filename) as f : pop_data = json.load(f) #打印每個(gè)國(guó)家2010年的人口數(shù)量 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中的每個(gè)鍵和值都是字符串。為處理這些人口數(shù)據(jù),我們需要將表示人口數(shù)量的字符串轉(zhuǎn)換為數(shù)字值,為此我們使用函數(shù)int(): print(country_name + ":" + str(population)) rab World:357868000 Caribbean small states:6880000 East Asia & Pacific (all income levels):2201536674 East Asia & Pacific (developing only):1961558757 Euro area:331766000 Europe & Central Asia (all income levels):890424544 Europe & Central Asia (developing only):405204000
獲取兩個(gè)字母的國(guó)別碼
'''制作地圖前,還需要解決數(shù)據(jù)存在的最后一個(gè)問(wèn)題。Pygal中的地圖制作工具要求數(shù)據(jù)為特定的格式:用國(guó)別碼表示國(guó)家,以及用數(shù)字表示人口數(shù)量。處理地理政治數(shù)據(jù)時(shí),經(jīng)常需要用到幾個(gè)標(biāo)準(zhǔn)化國(guó)別碼集。
population_data.json中包含的是三個(gè)字母的國(guó)別碼,但Pygal使用兩個(gè)字母的國(guó)別碼。我們需要想辦法根據(jù)國(guó)家名獲取兩個(gè)字母的國(guó)別碼。
Pygal使用的國(guó)別碼存儲(chǔ)在模塊i18n(internationalization的縮寫(xiě))中。
字典COUNTRIES包含的鍵和值分別為兩個(gè)字母的國(guó)別碼和國(guó)家名。
要查看這些國(guó)別碼,可從模塊i18n中導(dǎo)入這個(gè)字典,并打印其鍵和值:'''
from pygal_maps_world.i18n import COUNTRIES for country_code in sorted(COUNTRIES.keys()): print(country_code, COUNTRIES[country_code]) ad Andorra ae United Arab Emirates af Afghanistan al Albania
為獲取國(guó)別碼,我們將編寫(xiě)一個(gè)函數(shù),它在COUNTRIES中查找并返回國(guó)別碼。
我們將這個(gè)函數(shù)放在一個(gè)名為country_codes的模塊中,以便能夠在可視化程序中導(dǎo)入它:
from pygal_maps_world.i18n import COUNTRIES def get_country_code(country_name): #根據(jù)指定的國(guó)家,返回Pygal使用的兩個(gè)字母的國(guó)別碼 for code,name in COUNTRIES.items(): if name == country_name : return code # 如果沒(méi)有找到指定的國(guó)家,就返回None return None #打印每個(gè)國(guó)家2010年的人口數(shù)量 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中的每個(gè)鍵和值都是字符串。為處理這些人口數(shù)據(jù),我們需要將表示人口數(shù)量的字符串轉(zhuǎn)換為數(shù)字值,為此我們使用函數(shù)int(): code = get_country_code(country_name) if code : print(code + ":" + str(population)) else: print('error - ' + ":" + str(population)) error - :357868000 error - :6880000 error - :2201536674 error - :1961558757 error - :331766000
導(dǎo)致顯示錯(cuò)誤消息的原因有兩個(gè)。首先,并非所有人口數(shù)量對(duì)應(yīng)的都是國(guó)家,有些人口數(shù)量對(duì)應(yīng)的是地區(qū)(阿拉伯世界)和經(jīng)濟(jì)類群(所有收入水平)。
其次,有些統(tǒng)計(jì)數(shù)據(jù)使用了不同的完整國(guó)家名(如Yemen, Rep.,而不是Yemen)。當(dāng)前,我們將忽略導(dǎo)致錯(cuò)誤的數(shù)據(jù),看看根據(jù)成功恢復(fù)了的數(shù)據(jù)制作出的地圖是什么樣的。
制作世界地圖
import pygal_maps_world.maps#創(chuàng)建了一個(gè)Worldmap實(shí)例,并設(shè)置了該地圖的的title屬性 wm = pygal_maps_world.maps.World() wm.title = 'North, Central, and South America' ''' 方法add(),它接受一個(gè)標(biāo)簽和一個(gè)列表,其中后者包含我們要突出的國(guó)家的國(guó)別碼。每次調(diào)用add()都將為指定的國(guó)家 選擇一種新顏色,并在圖表左邊顯示該顏色和指定的標(biāo)簽。我們要以同一種顏色顯示整個(gè)北美地區(qū),因此第一次調(diào)用add() 時(shí),在傳遞給它的列表中包含'ca'、'mx'和'us',以同時(shí)突出加拿大、墨西哥和美國(guó)。接下來(lái),對(duì)中美和南美國(guó)家做同樣 的處理。 ''' 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()創(chuàng)建一個(gè)包含該圖表的.svg文件,你可以在瀏覽器中打開(kāi)它。輸出是一幅以不同顏色突出北美、 中美和南美的地圖 ''' wm.render_to_file('americas.svg')
繪制完整的世界人口地圖
'''要呈現(xiàn)其他國(guó)家的人口數(shù)量,需要將前面處理的數(shù)據(jù)轉(zhuǎn)換為Pygal要求的字典格式:鍵為兩個(gè)字母的國(guó)別碼,值為人口數(shù)量。
為此,在world_population.py中添加如下代碼:
import json
#將數(shù)據(jù)加載到一個(gè)列表中 filename= 'population_data.json' with open(filename) as f : pop_data = json.load(f) def get_country_code(country_name): #根據(jù)指定的國(guó)家,返回Pygal使用的兩個(gè)字母的國(guó)別碼 for code,name in COUNTRIES.items(): if name == country_name : return code # 如果沒(méi)有找到指定的國(guó)家,就返回None return None #創(chuàng)建一個(gè)包含人口數(shù)量是字典 cc_populations = {} #打印每個(gè)國(guó)家2010年的人口數(shù)量 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中的每個(gè)鍵和值都是字符串。為處理這些人口數(shù)據(jù),我們需要將表示人口數(shù)量的字符串轉(zhuǎn)換為數(shù)字值,為此我們使用函數(shù)int(): code = get_country_code(country_name) if code : cc_populations[code] = population import pygal_maps_world.maps#創(chuàng)建了一個(gè)Worldmap實(shí)例,并設(shè)置了該地圖的的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')
根據(jù)人口數(shù)量將國(guó)家分組
import json #將數(shù)據(jù)加載到一個(gè)列表中 filename= 'population_data.json' with open(filename) as f : pop_data = json.load(f) def get_country_code(country_name): #根據(jù)指定的國(guó)家,返回Pygal使用的兩個(gè)字母的國(guó)別碼 for code,name in COUNTRIES.items(): if name == country_name : return code # 如果沒(méi)有找到指定的國(guó)家,就返回None return None #創(chuàng)建一個(gè)包含人口數(shù)量是字典 cc_populations = {} #打印每個(gè)國(guó)家2010年的人口數(shù)量 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中的每個(gè)鍵和值都是字符串。為處理這些人口數(shù)據(jù),我們需要將表示人口數(shù)量的字符串轉(zhuǎn)換為數(shù)字值,為此我們使用函數(shù)int(): code = get_country_code(country_name) if code : cc_populations[code] = population ###根據(jù)人口數(shù)量將國(guó)家分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] = pop import pygal_maps_world.maps#創(chuàng)建了一個(gè)Worldmap實(shí)例,并設(shè)置了該地圖的的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')
根據(jù)Pygal設(shè)置世界地圖的樣式
在這個(gè)地圖中,根據(jù)人口將國(guó)家分組雖然很有效,但默認(rèn)的顏色設(shè)置很難看。例如,在這里,Pygal選擇了鮮艷的粉色和綠色基色。
下面使用Pygal樣式設(shè)置指令來(lái)調(diào)整顏色。我們也讓Pygal使用一種基色,但將指定該基色,并讓三個(gè)分組的顏色差別更大
###根據(jù)Pygal設(shè)置世界地圖的樣式 ''' 在這個(gè)地圖中,根據(jù)人口將國(guó)家分組雖然很有效,但默認(rèn)的顏色設(shè)置很難看。例如,在這里,Pygal選擇了鮮艷的粉色 和綠色基色。下面使用Pygal樣式設(shè)置指令來(lái)調(diào)整顏色。我們也讓Pygal使用一種基色,但將指定該基色,并讓三個(gè)分組 的顏色差別更大 ''' ###根據(jù)人口數(shù)量將國(guó)家分組 import json #將數(shù)據(jù)加載到一個(gè)列表中 filename= 'population_data.json' with open(filename) as f : pop_data = json.load(f) def get_country_code(country_name): #根據(jù)指定的國(guó)家,返回Pygal使用的兩個(gè)字母的國(guó)別碼 for code,name in COUNTRIES.items(): if name == country_name : return code # 如果沒(méi)有找到指定的國(guó)家,就返回None return None #創(chuàng)建一個(gè)包含人口數(shù)量是字典 cc_populations = {} #打印每個(gè)國(guó)家2010年的人口數(shù)量 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中的每個(gè)鍵和值都是字符串。為處理這些人口數(shù)據(jù),我們需要將表示人口數(shù)量的字符串轉(zhuǎn)換為數(shù)字值,為此我們使用函數(shù)int(): code = get_country_code(country_name) if code : cc_populations[code] = population ###根據(jù)人口數(shù)量將國(guó)家分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] = pop import pygal_maps_world.maps#創(chuàng)建了一個(gè)Worldmap實(shí)例,并設(shè)置了該地圖的的title屬性 from pygal.style import RotateStyle from 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數(shù)據(jù)可視化繪制世界人口地圖的詳細(xì)內(nèi)容,更多關(guān)于python繪制世界人口地圖的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Python mplfinance庫(kù)繪制金融圖表實(shí)現(xiàn)數(shù)據(jù)可視化實(shí)例探究
- Python報(bào)表自動(dòng)化之從數(shù)據(jù)到可視化一站式指南
- Python對(duì)中國(guó)500強(qiáng)排行榜數(shù)據(jù)進(jìn)行可視化分析實(shí)戰(zhàn)
- Caffe數(shù)據(jù)可視化環(huán)境python接口配置教程示例
- python數(shù)據(jù)可視化pygal模擬擲骰子實(shí)現(xiàn)示例
- python數(shù)據(jù)可視化繪制火山圖示例
- python數(shù)據(jù)可視化matplotlib繪制折線圖示例
- python?AutoViz庫(kù)一行代碼實(shí)現(xiàn)可視化數(shù)據(jù)集
相關(guān)文章
利用QT寫(xiě)一個(gè)極簡(jiǎn)單的圖形化Python鬧鐘程序
這篇文章主要介紹了利用QT寫(xiě)一個(gè)極簡(jiǎn)單的圖形化Python鬧鐘程序,核心代碼只有25行,顯示屏幕提示而沒(méi)有鬧鈴聲音,需要的朋友可以參考下2015-04-04用Python進(jìn)行基礎(chǔ)的函數(shù)式編程的教程
這篇文章主要介紹了用Python進(jìn)行基礎(chǔ)的函數(shù)式編程的教程,除了面向?qū)ο缶幊桃馔?、Python還可以進(jìn)行簡(jiǎn)單的不依賴外部變量的函數(shù)式編程,本文介紹了其中的一些基礎(chǔ),需要的朋友可以參考下2015-03-03python實(shí)現(xiàn)簡(jiǎn)易聊天對(duì)話框
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)簡(jiǎn)易聊天對(duì)話框,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02python實(shí)現(xiàn)列表中由數(shù)值查到索引的方法
今天小編就為大家分享一篇python實(shí)現(xiàn)列表中由數(shù)值查到索引的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06Python?add()集合中添加元素的實(shí)現(xiàn)
本文主要介紹了Python?add()集合中添加元素的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07Python實(shí)現(xiàn)嵌套列表的7中方法總結(jié)
這篇文章主要來(lái)給大家講解一個(gè)Python的進(jìn)階知識(shí)點(diǎn):如何將一個(gè)嵌套的大列表展開(kāi)形成一個(gè)列表。小編提供了7種方法供大家學(xué)習(xí)參考,希望大家能喜歡2023-03-03python-yml文件讀寫(xiě)與xml文件讀寫(xiě)
這篇文章主要介紹了python-yml文件讀寫(xiě)與xml文件讀寫(xiě),文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-08-08