python數(shù)據(jù)可視化--制作世界人口地圖:JSON格式文件

數(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ù)量,因此我們首先編寫一個(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è)問題。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的縮寫)中。字典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ó)別碼,我們將編寫一個(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
    # 如果沒有找到指定的國(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文件,你可以在瀏覽器中打開它。輸出是一幅以不同顏色突出北美、
中美和南美的地圖
'''
wm.render_to_file('americas.svg')
image.png

繪制完整的世界人口地圖

'''要呈現(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
    # 如果沒有找到指定的國(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')
image.png

根據(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
    # 如果沒有找到指定的國(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')
image.png

根據(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
    # 如果沒有找到指定的國(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')
image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容