Python模塊---製做新冠疫情世界地圖

pyecharts模塊

簡介

Echarts 是一個由百度開源的數據可視化,憑藉着良好的交互性,精巧的圖表設計,獲得了衆多開發者的承認。而 Python 是一門富有表達力的語言,很適合用於數據處理。當數據分析趕上數據可視化時,pyecharts 誕生了。
若是想要掌握pyecharts,能夠閱讀pyecharts中文文檔,裏面的圖表類型和配置項寫的很是詳細,我就不過多的贅述了html

安裝pyecharts

安裝的命令也很是簡單:json

pip install pyecharts

安裝成功:
api

測試pyecharts模塊

咱們能夠嘗試運行官方文檔所給出的幾個小例子來測試一下pyecharts模塊是否成功安裝
打開編輯器,輸入並運行如下代碼:app

from pyecharts.charts import Bar
from pyecharts import options as opts
# 內置主題類型可查看 pyecharts.globals.ThemeType
from pyecharts.globals import ThemeType

bar = (
    Bar(init_opts=opts.InitOpts(theme=ThemeType.LIGHT))
    .add_xaxis(["襯衫", "羊毛衫", "雪紡衫", "褲子", "高跟鞋", "襪子"])
    .add_yaxis("商家A", [5, 20, 36, 10, 75, 90])
    .add_yaxis("商家B", [15, 6, 45, 20, 35, 66])
    .set_global_opts(title_opts=opts.TitleOpts(title="主標題", subtitle="副標題"))
)
bar.render()   #保存爲html文件

若此時在當前目錄下生成了一個名爲render.html的文件
echarts

打開此文件,看到以下的圖片則證實安裝模塊成功
框架

pyecharts實戰:繪製新冠肺炎疫情地圖

需求分析

想要製做全球疫情的地圖(空氣質量圖,人口分佈圖也是同理),首先須要的就是每一個國家的疫情數據,好比人數,治癒數,增加數...... 那麼咱們該如何獲取到這些信息呢?dom

請求數據

咱們發現不少app和網頁上都會有最新的疫情信息公佈,我選取的數據來源是騰訊地圖。
首先打開騰訊地圖的疫情信息頁,能夠發現疫情的信息展示在這一頁中
編輯器

獲取這些信息的方法有不少種,能夠是用表達式提取,也能夠抓包分析,我更喜歡的一種方法是抓包分析。post

右擊《檢查》,點擊《network》選項卡並刷新界面,看到加載出來不少數據包,找到裏面最像列表的一個list數據包
測試

此時發現,這個list數據包正式咱們要提取的數據列表,裏面的每一個鍵值對都表明着相應的數據,提取到這些鍵值對就能夠獲取到全部的數據信息了,再次回到headers,選項卡下面對應的網址就是咱們即將請求的網址,這裏咱們須要注意的是,這個網址對應的請求是post而不是咱們常常使用的get

向網頁請求數據:

import requests

url = 'https://api.inews.qq.com/newsqa/v1/automation/foreign/country/ranklist'
response = requests.post(url).text
print(response)

能夠看到這個網頁並無設置反爬蟲,能夠輕鬆的獲取到數據

提取數據

咱們剛剛請求到的數據格式是字符格式,並不能被咱們直接提取到,必須想將字符格式的數據轉換爲字典格式才能夠開始下一步的提取

resp = json.loads(response)   #使用變量resp來接收字典格式的數據

將變量轉化爲字典格式後,就要開始提取數據了 提取json類型的數據可使用取出列表元素的方法來提取,即先遍歷列表將每一個國家的信息提取出來,再分別從這些條信息中提取到咱們想要的數據

提取數據:

import json

resp = json.loads(response)   #使用變量resp來接收字典格式的數據
for data in resp['data']:  #遍歷提取每一個國家的疫情數據
    name = data['name']   #國家名
    confirm = data['confirm']   #該國家疫情人數
    print(name,confirm)

打印數據:

處理數據

在獲得了國家和人數信息以後,還須要將數據存儲到字典中才能傳入圖表中,這就須要咱們手動的轉換數據,並儲存到字典中

map_version = {}  #定義空字典
for data in resp['data']:  #遍歷提取每一個國家的疫情數據
    name = data['name']   #國家名
    confirm = data['confirm']   #該國家疫情人數
    map_version[name] = int(confirm)  #將國家和人數以鍵值對的形式傳入字典

輸出字典:

此時打印出來的字典是標準的字典格式,可是這種格式並非pyecharts所要求的格式,因此還須要一行代碼來進行轉換

element = list(map_version.items())

而後就能夠輸出傳入數據的標準格式:

製做可視化地圖

在將數據爬取、變換、整理後,全部準備工做都已經作完,下面咱們來調用數據實現數據可視化

先寫出一個初步的框架來接收內容

from pyecharts.charts import Map,Geo

map = Map().add(series_name="世界疫情分佈圖",  #名稱
                data_pair=element,   #傳入數據
                maptype='world',   #地圖類型
                )
map.render('map.html')  #命名並保存

運行代碼,發現當前文件夾下出現了一個map.html文件,雙擊運行

看到這個圖表以後,發現代碼的運行並無問題,可是數據卻沒有傳到地圖中,這是因爲pyecharts默認的世界地圖中的國家名是英文,因此咱們就要傳入一個字典來替代掉這些英文

設置可視化地圖

生成了地圖以後,接下來就是要保證地圖的正確性和美觀,因此咱們要來設置世界地圖

地圖上顯示國家名太多,影響可讀性,因此設置爲不顯示國家名

from pyecharts import options

map.set_series_opts(label_opts=options.LabelOpts(is_show=False))  #不顯示國家名

按照感染人數的不一樣,給地圖添加不一樣的顏色

#設置全局配置項
map.set_global_opts(visualmap_opts=options.VisualMapOpts(max_=1100000,is_piecewise=True,pieces=[
                 {"min": 500000},
                 {"min": 200000, "max": 499999},
                 {"min": 100000, "max": 199999},
                 {"min": 50000, "max": 99999},
                 {"min": 10000, "max": 49999},
                 {"max": 9999},]))

表明國家首都的圓點不美觀,去掉紅點:

map = Map().add(
                                    is_map_symbol_show=False,  #不顯示標記
                                    )

設置背景顏色併爲網頁取名:

map = Map(options.InitOpts(bg_color="#87CEFA",page_title='世界疫情分佈')).add()

到了如今全部的配置已經完成,可是圖表要想顯示數據還須要傳入一個字典來替換掉默認的英文名,具體實現請看下面的完整代碼。

完整代碼

import requests
import json
from pyecharts.charts import Map
from pyecharts import options

url = 'https://api.inews.qq.com/newsqa/v1/automation/foreign/country/ranklist'
response = requests.post(url).text
resp = json.loads(response)   #使用變量resp來接收字典格式的數據
map_version = {}  #定義空字典
for data in resp['data']:  #遍歷提取每一個國家的疫情數據
    name = data['name']   #國家名
    confirm = data['confirm']   #該國家疫情人數
    map_version[name] = int(confirm)  #將國家和人數以鍵值對的形式傳入字典
element = list(map_version.items())   #將字典值調整爲能夠傳入地圖的格式
name_map = {
    'Singapore Rep.': '新加坡',
    'Dominican Rep.': '多米尼加',
    'Palestine': '巴勒斯坦',
    'Bahamas': '巴哈馬',
    'Timor-Leste': '東帝汶',
    'Afghanistan': '阿富汗',
    'Guinea-Bissau': '幾內亞比紹',
    "Côte d'Ivoire": '科特迪瓦',
    'Siachen Glacier': '錫亞琴冰川',
    "Br. Indian Ocean Ter.": '英屬印度洋領土',
    'Angola': '安哥拉',
    'Albania': '阿爾巴尼亞',
    'United Arab Emirates': '阿聯酋',
    'Argentina': '阿根廷',
    'Armenia': '亞美尼亞',
    'French Southern and Antarctic Lands': '法屬南半球和南極領地',
    'Australia': '澳大利亞',
    'Austria': '奧地利',
    'Azerbaijan': '阿塞拜疆',
    'Burundi': '布隆迪',
    'Belgium': '比利時',
    'Benin': '貝寧',
    'Burkina Faso': '布基納法索',
    'Bangladesh': '孟加拉國',
    'Bulgaria': '保加利亞',
    'The Bahamas': '巴哈馬',
    'Bosnia and Herz.': '波斯尼亞和黑塞哥維那',
    'Belarus': '白俄羅斯',
    'Belize': '伯利茲',
    'Bermuda': '百慕大',
    'Bolivia': '玻利維亞',
    'Brazil': '巴西',
    'Brunei': '文萊',
    'Bhutan': '不丹',
    'Botswana': '博茨瓦納',
    'Central African Rep.': '中非',
    'Canada': '加拿大',
    'Switzerland': '瑞士',
    'Chile': '智利',
    'China': '中國',
    'Ivory Coast': '象牙海岸',
    'Cameroon': '喀麥隆',
    'Dem. Rep. Congo': '剛果民主共和國',
    'Congo': '剛果',
    'Colombia': '哥倫比亞',
    'Costa Rica': '哥斯達黎加',
    'Cuba': '古巴',
    'N. Cyprus': '北塞浦路斯',
    'Cyprus': '塞浦路斯',
    'Czech Rep.': '捷克',
    'Germany': '德國',
    'Djibouti': '吉布提',
    'Denmark': '丹麥',
    'Algeria': '阿爾及利亞',
    'Ecuador': '厄瓜多爾',
    'Egypt': '埃及',
    'Eritrea': '厄立特里亞',
    'Spain': '西班牙',
    'Estonia': '愛沙尼亞',
    'Ethiopia': '埃塞俄比亞',
    'Finland': '芬蘭',
    'Fiji': '斐',
    'Falkland Islands': '福克蘭羣島',
    'France': '法國',
    'Gabon': '加蓬',
    'United Kingdom': '英國',
    'Georgia': '格魯吉亞',
    'Ghana': '加納',
    'Guinea': '幾內亞',
    'Gambia': '岡比亞',
    'Guinea Bissau': '幾內亞比紹',
    'Eq. Guinea': '赤道幾內亞',
    'Greece': '希臘',
    'Greenland': '格陵蘭',
    'Guatemala': '危地馬拉',
    'French Guiana': '法屬圭亞那',
    'Guyana': '圭亞那',
    'Honduras': '洪都拉斯',
    'Croatia': '克羅地亞',
    'Haiti': '海地',
    'Hungary': '匈牙利',
    'Indonesia': '印度尼西亞',
    'India': '印度',
    'Ireland': '愛爾蘭',
    'Iran': '伊朗',
    'Iraq': '伊拉克',
    'Iceland': '冰島',
    'Israel': '以色列',
    'Italy': '意大利',
    'Jamaica': '牙買加',
    'Jordan': '約旦',
    'Japan': '日本',
    'Kazakhstan': '哈薩克斯坦',
    'Kenya': '肯尼亞',
    'Kyrgyzstan': '吉爾吉斯斯坦',
    'Cambodia': '柬埔寨',
    'Korea': '韓國',
    'Kosovo': '科索沃',
    'Kuwait': '科威特',
    'Lao PDR': '老撾',
    'Lebanon': '黎巴嫩',
    'Liberia': '利比里亞',
    'Libya': '利比亞',
    'Sri Lanka': '斯里蘭卡',
    'Lesotho': '萊索托',
    'Lithuania': '立陶宛',
    'Luxembourg': '盧森堡',
    'Latvia': '拉脫維亞',
    'Morocco': '摩洛哥',
    'Moldova': '摩爾多瓦',
    'Madagascar': '馬達加斯加',
    'Mexico': '墨西哥',
    'Macedonia': '馬其頓',
    'Mali': '馬裏',
    'Myanmar': '緬甸',
    'Montenegro': '黑山',
    'Mongolia': '蒙古',
    'Mozambique': '莫桑比克',
    'Mauritania': '毛里塔尼亞',
    'Malawi': '馬拉維',
    'Malaysia': '馬來西亞',
    'Namibia': '納米比亞',
    'New Caledonia': '新喀里多尼亞',
    'Niger': '尼日爾',
    'Nigeria': '尼日利亞',
    'Nicaragua': '尼加拉瓜',
    'Netherlands': '荷蘭',
    'Norway': '挪威',
    'Nepal': '尼泊爾',
    'New Zealand': '新西蘭',
    'Oman': '阿曼',
    'Pakistan': '巴基斯坦',
    'Panama': '巴拿馬',
    'Peru': '祕魯',
    'Philippines': '菲律賓',
    'Papua New Guinea': '巴布亞新幾內亞',
    'Poland': '波蘭',
    'Puerto Rico': '波多黎各',
    'Dem. Rep. Korea': '朝鮮',
    'Portugal': '葡萄牙',
    'Paraguay': '巴拉圭',
    'Qatar': '卡塔爾',
    'Romania': '羅馬尼亞',
    'Russia': '俄羅斯',
    'Rwanda': '盧旺達',
    'W. Sahara': '西撒哈拉',
    'Saudi Arabia': '沙特阿拉伯',
    'Sudan': '蘇丹',
    'S. Sudan': '南蘇丹',
    'Senegal': '塞內加爾',
    'Solomon Is.': '所羅門羣島',
    'Sierra Leone': '塞拉利昂',
    'El Salvador': '薩爾瓦多',
    'Somaliland': '索馬里蘭',
    'Somalia': '索馬里',
    'Serbia': '塞爾維亞',
    'Suriname': '蘇里南',
    'Slovakia': '斯洛伐克',
    'Slovenia': '斯洛文尼亞',
    'Sweden': '瑞典',
    'Swaziland': '斯威士蘭',
    'Syria': '敘利亞',
    'Chad': '乍得',
    'Togo': '多哥',
    'Thailand': '泰國',
    'Tajikistan': '塔吉克斯坦',
    'Turkmenistan': '土庫曼斯坦',
    'East Timor': '東帝汶',
    'Trinidad and Tobago': '特里尼達和多巴哥',
    'Tunisia': '突尼斯',
    'Turkey': '土耳其',
    'Tanzania': '坦桑尼亞',
    'Uganda': '烏干達',
    'Ukraine': '烏克蘭',
    'Uruguay': '烏拉圭',
    'United States': '美國',
    'Uzbekistan': '烏茲別克斯坦',
    'Venezuela': '委內瑞拉',
    'Vietnam': '越南',
    'Vanuatu': '瓦努阿圖',
    'West Bank': '西岸',
    'Yemen': '也門',
    'South Africa': '南非',
    'Zambia': '贊比亞',
    'Zimbabwe': '津巴布韋',
    'Comoros': '科摩羅'
}

map = Map(options.InitOpts(bg_color="#87CEFA",page_title='世界疫情分佈')).\
    add(series_name="世界疫情分佈圖",  #名稱
        data_pair=element,   #傳入數據
        is_map_symbol_show=False,  #不顯示標記
        maptype='world',   #地圖類型
        name_map=name_map,
        )
#設置全局配置項
map.set_global_opts(visualmap_opts=options.VisualMapOpts(max_=1100000,is_piecewise=True,pieces=[
                 {"min": 500000},
                 {"min": 200000, "max": 499999},
                 {"min": 100000, "max": 199999},
                 {"min": 50000, "max": 99999},
                 {"min": 10000, "max": 49999},
                 {"max": 9999},]))
#設置系列配置項
map.set_series_opts(label_opts=options.LabelOpts(is_show=False))  #不顯示國家名
map.render('map.html')  #命名並保存

實現結果

這個結果能夠動態的顯示在網頁中,能夠根據人數來篩選地圖的板塊,並且方便縮放

相關文章
相關標籤/搜索