大膽嘗試乃是解決debug的關鍵!尤其是掌握的資訊不足的時候,大膽嘗試可以節省半天的時間,免去debug糾結之苦。
首先展示一下本文的成果,以佐證文章的真實可靠。結果如下圖:
注意:pygal為web互動式插件,是以需要聯網!
問題描述:
在學習《python程式設計:從入門到精通》的pygal繪制世界地圖時,遇到了這樣一個問題:
運作程式報錯,提示模型不存在,出錯代碼如下:
from pygal.i18n import COUNTRIES
查閱pygal文檔可知,這個子產品已被遺棄,使用新的map包,地圖繪制指令變為:
wm = pygal.maps.world.World()
解決辦法:
在Anaconda的Anaconda prompt中輸入指令:
pip install pygal_maps_world
安裝包,由于我已安裝了此包,是以再次執行安裝将出現下圖所示内容:
然後,導入檔案修改相應代碼即可。此包導入指令如下:
最後,貼出完整代碼(python采用縮進格式,一定合理縮進代碼):
檔案country_codes.py代碼:
import pygal.maps.world # 導入世界地圖包pygal_maps_world
# 定義函數,傳回适用于pygal的兩位國别碼
def get_country_code(country_name):
# pygal兩位國别碼清單表示法:pygal.maps.world.COUNTRIES.items()
for code,name in pygal.maps.world.COUNTRIES.items():
if name == country_name:
return code
return None
檔案 country_codes.py代碼如下:
import json
import pygal.maps.world # 導入世界地圖繪制包,用于繪制地圖
from country_codes import get_country_code # 導入國别碼識别包
# 讀取資料檔案population_data.json(不知哪兒可以加載資料檔案,需要的可以留言)
filename = 'population_data.json'
with open(filename) as f:
pop_data = json.load(f) # 将json格式轉換為python識别格式
cc_populations = {} # 用于存儲人口資料
for pop_dict in pop_data:
if pop_dict['Year'] == '2010': # 提取2010年的資料
country_name = pop_dict['Country Name']
# 将格式不統一的人口資料轉換為浮點型,再轉換為int型統一格式,供pygal繪圖使用
population =int(float( pop_dict['Value']))
code = get_country_code(country_name)
# 按國别碼提取正确的國家和對應人口資料
if code:
cc_populations[code]=population
#根據人口數量将國家分成三組,0-1千萬,1千萬-10億,10億以上
cc_pops_1,cc_pops_2,cc_pops_3 = {},{},{}
for cc,pop in cc_populations.items():
if pop < :
cc_pops_1[cc] = pop
elif pop < :
cc_pops_2[cc] = pop
else:
cc_pops_3[cc] = pop
wm = pygal.maps.world.World() # 生成世界地圖執行個體
wm.title = 'World Population in 2010, by Country' # 設定标題
wm.add('1-10m',cc_pops_1) # 添加0——1千萬的國家和人口
wm.add('10m-1bn',cc_pops_2) # 添加1千萬——10億的國家和人口
wm.add('>bn',cc_pops_3) # 添加10億以上的國家和人口
wm.render_to_file('world_population.svg') # 渲染視圖到檔案,通過浏覽器可檢視
将兩個檔案儲存到同一目錄,運作檔案country_codes.py,以浏覽器的方式打開world_population.svg檔案,即可看到文章開頭展示的圖檔内容。