目錄
- 項目場景
- 問題描述
- 原因分析
- 解決方案
- 完整代碼
項目場景
Python數據可視化,使用 Pyecharts.charts 模塊中的Map,并導入數據來構建全國疫情熱力地圖
B站 黑馬程序員 Python課程【P106 第一階段 - 第十一章 - 02全國疫情地圖構建】
問題描述
??本人在學習該章節課程時,代碼和視頻中的代碼是完全一致的,但是生成的地圖卻和視頻中不一樣,生成結果中,不顯示地圖熱力和數據,問題代碼及運行結果如下:
import json
from pyecharts.charts import Map
from pyecharts.options import *# 讀取數據文件
f = open("C:\\Users\\18379\\Desktop\\可視化案例數據\\地圖數據\\疫情.txt", "r", encoding="UTF-8")
data = f.read()
# 關閉文件
f.close()# 將字符串json轉換為python的字典
data_dict = json.loads(data)# 從字典中取出省份的數據
province_data_list = data_dict["areaTree"][0]["children"]# 組裝每個省份和確診人數為元組,并各個省的數據都封裝入列表內
data_list = []
for province_data in province_data_list:province_name = province_data["name"]province_confirm = province_data["total"]["confirm"]data_list.append((province_name, province_confirm))# 創建地圖對象
map = Map()# 添加數據
map.add("各省份確診人數", data_list, "china")# 設置全局配置,定制分段的視覺映射
map.set_global_opts(title_opts=TitleOpts(title="全國疫情地圖"),visualmap_opts=VisualMapOpts(is_show=True,is_piecewise=True,pieces=[{"min": 1, "max": 99, "lable": "1~99人", "color": "#CCFFFF"},{"min": 100, "max": 999, "lable": "100~9999人", "color": "#FFFF99"},{"min": 1000, "max": 4999, "lable": "1000~4999人", "color": "#FF9966"},{"min": 5000, "max": 9999, "lable": "5000~99999人", "color": "#FF6666"},{"min": 10000, "max": 99999, "lable": "10000~99999人", "color": "#CC3333"},{"min": 100000, "lable": "100000+", "color": "#990033"},])
)# 繪圖
map.render("全國疫情地圖.html")
運行結果:
原因分析
??在代碼和所使用數據完全一致的情況下,仍然得不到正確的結果,所以只能去考慮是不是pyecharts版本問題,該視頻上傳時間是在2022年8月,時隔一年很可能是pyecharts版本進行了更新,導致代碼出現bug,此時我們再仔細觀察視頻中生成的地圖,與自己生成的地圖進行對比,能夠發現一些問題,對比如下:
??通過以上對比很明顯能夠發現,兩者省份名稱不對應,所以可以大膽猜測,是不是從文本數據中提取出的省份信息與Map中內置的省份名稱不對應所導致的數據不能正常顯示呢?下面我們來驗證一下自己的想法。
解決方案
第一步:
??我們通過for循環從文本中提取各省份對應數據,得到 data_list 后先打印一下其中的內容看一眼,顯然列表中的省份名稱與視頻中生成地圖的省份名稱是對應的,而與我們生成地圖中的省份名稱不對應。
第二步:
??嘗試更改 data_list 中省份名稱,使其與Map中省份名稱對應,在for循環體中增加如下代碼,來處理省份不匹配問題。
注意:23個省 + 5個自治區 + 4個直轄市 +2個特別行政區
# 組裝每個省份和確診人數為元組,并各個省的數據都封裝入列表內
data_list = []
for province_data in province_data_list:province_name = province_data["name"]province_confirm = province_data["total"]["confirm"]#處理省份不匹配問題if province_name == "新疆":province_name = "新疆維吾爾自治區"elif province_name == "廣西":province_name = "廣西壯族自治區"elif province_name == "寧夏":province_name = "寧夏回族自治區"elif province_name in ["內蒙古","西藏"]:province_name = province_name + "自治區"elif province_name in ["北京","天津","重慶","上海"]:province_name = province_name + "市"elif province_name in ["香港","澳門"]:province_name = province_name + "特別行政區"else:province_name = province_name + "省"data_list.append((province_name, province_confirm))
print(data_list)
第三步:
??重新運行并打印 data_list ,此時省份名稱已更改,查看地圖,熱力和數據正常顯示,問題解決!
完整代碼
import json
from pyecharts.charts import Map
from pyecharts.options import *# 讀取數據文件
f = open("C:\\Users\\18379\\Desktop\\可視化案例數據\\地圖數據\\疫情.txt", "r", encoding="UTF-8")
data = f.read()
# 關閉文件
f.close()# 將字符串json轉換為python的字典
data_dict = json.loads(data)# 從字典中取出省份的數據
province_data_list = data_dict["areaTree"][0]["children"]# 組裝每個省份和確診人數為元組,并各個省的數據都封裝入列表內
data_list = []
for province_data in province_data_list:province_name = province_data["name"]province_confirm = province_data["total"]["confirm"]#處理省份不匹配問題if province_name == "新疆":province_name = "新疆維吾爾自治區"elif province_name == "廣西":province_name = "廣西壯族自治區"elif province_name == "寧夏":province_name = "寧夏回族自治區"elif province_name in ["內蒙古","西藏"]:province_name = province_name + "自治區"elif province_name in ["北京","天津","重慶","上海"]:province_name = province_name + "市"elif province_name in ["香港","澳門"]:province_name = province_name + "特別行政區"else:province_name = province_name + "省"data_list.append((province_name, province_confirm))
print(data_list)# 創建地圖對象
map = Map()# 添加數據
map.add("各省份確診人數", data_list, "china")# 設置全局配置,定制分段的視覺映射
map.set_global_opts(title_opts=TitleOpts(title="全國疫情地圖"),visualmap_opts=VisualMapOpts(is_show=True,is_piecewise=True,pieces=[{"min": 1, "max": 99, "lable": "1~99人", "color": "#CCFFFF"},{"min": 100, "max": 999, "lable": "100~9999人", "color": "#FFFF99"},{"min": 1000, "max": 4999, "lable": "1000~4999人", "color": "#FF9966"},{"min": 5000, "max": 9999, "lable": "5000~99999人", "color": "#FF6666"},{"min": 10000, "max": 99999, "lable": "10000~99999人", "color": "#CC3333"},{"min": 100000, "lable": "100000+", "color": "#990033"},])
)# 繪圖
map.render("全國疫情地圖.html")