天天看點

Pygal之世界地圖繪制from pygal.i18n import COUNTRIES 報錯的解決辦法

大膽嘗試乃是解決debug的關鍵!尤其是掌握的資訊不足的時候,大膽嘗試可以節省半天的時間,免去debug糾結之苦。

首先展示一下本文的成果,以佐證文章的真實可靠。結果如下圖:

Pygal之世界地圖繪制from pygal.i18n import COUNTRIES 報錯的解決辦法
注意:pygal為web互動式插件,是以需要聯網!

問題描述:

在學習《python程式設計:從入門到精通》的pygal繪制世界地圖時,遇到了這樣一個問題:

運作程式報錯,提示模型不存在,出錯代碼如下:

from pygal.i18n import COUNTRIES 
           

查閱pygal文檔可知,這個子產品已被遺棄,使用新的map包,地圖繪制指令變為:

wm = pygal.maps.world.World()
           

解決辦法:

在Anaconda的Anaconda prompt中輸入指令:

pip install pygal_maps_world

安裝包,由于我已安裝了此包,是以再次執行安裝将出現下圖所示内容:

Pygal之世界地圖繪制from pygal.i18n import COUNTRIES 報錯的解決辦法

然後,導入檔案修改相應代碼即可。此包導入指令如下:

最後,貼出完整代碼(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檔案,即可看到文章開頭展示的圖檔内容。