人口數據為json格式文件,因此需使用json模塊來處理他們
Pygal提供了一個適合初學者使用的地圖創建工具,可以使用它來對人口數據進行可視化,以探索全球人口的分布情況。
(1)導入python自帶的世界地圖包和國別碼的包
#導入世界地圖包(python 自帶世界地圖包)
import pygal.maps.world
#導入國別碼的包 COUNTRIES是一個字典類型的數據信息,key為國別名,value值為國家名
from pygal_maps_world.i18n import COUNTRIES
(2)下載世界人口數據集並查看數據的相關信息
filename="D:\python_test1\population_data.json"
with open(filename)as f:
#利用json模塊讀文件 json.load()
#pop_data json類型對象
pop_data=json.load(f)
print(pop_data)
#'Country Code': 'MEA', 'Year': '2000', 'Value': '312596988.293994'}, {'Country Name': 'Middle East & North Africa (all income levels)', 'Country Code': 'MEA', 'Year': '2001', 'Value': '318759417.157542'}, {'Country Name': 'Middle East & North Africa (all income levels)', 'Country Code': 'MEA', 'Year': '2002', 'Value': '325087018.594954'},......
【重難點】:
完成json格式文件相關操作
(1)json.dumps() 將Python對象編碼成JSON字符串 ==>寫入
(2)json.loads() 將已編碼JSON字符串解碼為Python對象(Json對象) ==>讀取
(3)創建函數,根據國家名,找到相應的國別碼
#創建函數,用於獲取國別碼 通過函數查找國別碼,提高代碼利用率
def get_country_code(country_name):
#根據指定的國家名稱,返回Pygal使用的兩個字母的國別碼
for code,name in COUNTRIES.items():
if name==country_name:#如果找到需要的值
return code
#若沒有找到,則返回none
return None
(4)可視化實例——繪制2010年世界人口地圖
def show_populationmap():
filename="D:\python_test1\population_data.json"
with open(filename)as f:
#利用json模塊讀文件 json.load()
#pop_data json類型對象
#讀取json文件(多個鍵值對)
pop_data=json.load(f)
#創建完整的世界人口地圖
#創建一個包含人口數量的字典
cc_population={
}
"""處理數據集,獲取需要的數據"""
for pop_dict in pop_data:
if pop_dict['Year'] == '2010':
country_name = pop_dict['Country Name']
# 將人口數量字符串 轉換為整型類型 轉化兩步走
population = int(float(pop_dict['Value']))
# 【注意】:原始數據的格式常常不統一,因此經常會出現錯誤,例如無法直接將一個包含小數點的字符串直接強制類型轉化為int類型。
# 【解決方式】:先將字符串轉化為浮點數,再將浮點數轉化為整數(轉化兩步走)。
# 函數float()將字符串轉換為小數,而函數int()丟棄小數部分,返回一個整數。
#獲取國別名(調用准備好的函數)
code=get_country_code(country_name)
#字典是另一種可變容器模型,每個鍵值對用冒號 (:) 分割,每個鍵值對之間用逗號(,) 分割,整個字典由花括號{}包圍;
#字典中的鍵一般是唯一的,如果重復則後面的一個鍵值對會覆蓋前面的,不過字典的值不需要唯一;
#值可以取任意數據類型,但鍵必須是不可變類型,例如字符串,數字或元組,但不能是列表因為列表可變。
if code :#如果國別碼不為空 往字典內部添加鍵值對
cc_population[code]=population
"""可視化繪圖"""
#繪制世界人口地圖
#新建Worldmap實例(python自帶地圖集)
wm=pygal.maps.world.World()
wm.title="World Population in 2010, by Country"
#add()方法接受一個標簽和一個列表,其中列表中包含要突出的國家的國別碼
#每次執行add()都會為指定的國家選擇一種新顏色,並在圖表左側顯示該顏色和指定的標簽
# wm.add('North America', ['ca', 'mx', 'us'])
# wm.add('Central America', ['bz', 'cr', 'gt', 'hn', 'ni', 'pa', 'sv'])
#對應國家添加人數
#add()方法接受一個標簽和一個字典,字典以國別碼為鍵,人口數為值,Pygal根據這些數字自動給不同國家著以深淺不一的顏色,一般數量較大,顏色較深
wm.add('2010',cc_population)#cc_population 字典類型
#保存為svg格式矢量圖
wm.render_to_file('D:\python_test1\ americas.svg')
【結果展示】
【重難點】:
(1)對精度較高的數據進行降低精度操作
將人口數量字符串 轉換為整型類型 轉化兩步走
population = int(float(pop_dict[‘Value’]))
由於從json文件中讀取文件內容,類型為字符型,若要進行數據處理或可視化,則需將數據轉換為數值型數據
例如:‘312596988.293994’ 該值精度較高,作可視化時,只需整型數據即可,但將如此高精度的數據直接轉化為整型,會經常出現錯誤
【問題描述】:原始數據的格式常常不統一,因此經常會出現錯誤,例如無法直接將一個包含小數點的字符串直接強制類型轉化為int類型
【解決方式】:通常采用,先將其轉換為浮點數類型,再轉換為整型(兩步走)
(2)調用python自帶的地圖模型
我們只需通過add()函數,為該地圖添加自己的實際數據,設置相關屬性,添加自己元素
#新建實例
wm=pygal.maps.world.World()
(3)add()函數
語法一、接收一個標簽和一個列表
其中列表中包含要突出的內容(例如本案例中需標亮的國家的國別名)
#每次執行add()都會為指定的國家選擇一種新顏色,並在圖表左側顯示該顏色和指定的標簽
例如:
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'])
語法二、接收一個標簽和一個字典
例如本案例中,字典以國別碼為鍵,人口數為值,Pygal根據這些數字自動給不同國家著以深淺不一的顏色
例如:
wm.add('North America', {
'ca':34126000, 'mx':309349000, 'us':113423000})
(5)進階版 1.0——將國家按照人口數量進行分組
def show_populationmap():
"""語法邏輯一致"""
#按人口總數進行分組 ,共分為3組
level1,level2,level3={
},{
},{
}
for pop_dict in pop_data:
if pop_dict['Year'] == '2010':
country_name = pop_dict['Country Name']
# 將人口數量字符串 轉換為整型類型 轉化兩步走
population = int(float(pop_dict['Value']))
# 獲取國別名
code = get_country_code(country_name)
if population>1000000000:#人口人數大於10億
if code: # 如果國別碼不為空
level1[code] = population
elif population>=10000000: #人口人數大於1億
if code:
level2[code] = population
else:
if code:
level3[code] = population
#創建地圖實例
new_wm=pygal.maps.world.World()
new_wm.title="World Population in 2010, by Country"
new_wm.add("above 100000000",level1)
new_wm.add("between 10000000 and 100000000", level2)
new_wm.add("below 10000000", level3)
#保存為svg格式文件
new_wm.render_to_file('D:\python_test1\ new_worlds_pop.svg')
【結果展示】:
(6)進階版 2.0——自定義地圖樣式
自定義地圖樣式時,需調用pygal模塊自帶的樣式模塊,自定義樣式設置
1、導入相關包
#Pygal樣式存儲在模塊style中,我們從這個模塊中導入了樣式RotateStyle
from pygal.style import RotateStyle, LightColorizedStyle
#RotateStyle可設置自己喜歡的顏色
#LightColorizedStyle可設置顏色高亮
2、實例應用
#新建樣式實例(可不寫base_style=)
new_wm_style = RotateStyle("#206790",base_style=LightColorizedStyle)
#創建地圖實例時,傳遞style參數
new_wm=pygal.maps.world.World(style=new_wm_style)
【重難點】:
(1)在創建RotateStyle實例時,提供一個16進制的RGB顏色實參,RotateStyle返回一個樣式對象。
(2)LightColorizedStyle 調用該類設置顏色高亮
情形一、使用該類時,不能直接控制使用的顏色,默認直接使用python的基色
【使用方法】:
wm_style = LightColorizedStyle
#創建實例時,傳遞該參數
情形二、若要使用自定義的顏色,控制地圖顏色
(同時實現控制顏色和顏色高亮) 調用RotateStyle()類
wm_style=RotateStyle("#336699",base_style=LightColorizedStyle)
#創建實例時,傳遞該參數