flask + pyecharts 疫情數據分析 搭建交互式動態可視化新冠肺炎疫情地圖(附代碼實現)

該項目是浙江大學地理空間數據庫課程作業8:空間分析中,使用 flask + pyecharts 搭建的簡單新冠肺炎疫情數據可視化交互分析平臺的一部分,完整的實現包含疫情數據獲取、態勢感知、預測分析、輿情監測等任務;

包含完整代碼、數據集和實現的github地址:
https://github.com/yunwei37/COVID-19-NLP-vis

項目分析報告已部署到網頁端,可點擊http://flask.yunwei123.tech/進行查看,數據已更新到6.17

最終效果:

動態交互展示的世界地圖:
在這裏插入圖片描述
除了世界地圖還可以動態展示中國地圖:(這裏就暫時沒有錄屏啦qwq)
在這裏插入圖片描述

代碼實現

由於篇幅限制,這裏討論一下具體的函數實現方式,完整代碼可在github中獲取:

實現的基本原理是採用ajax方式,通過頁面響應向後端flask發送請求,用pyecharts渲染新的地圖,然後返回前端進行動態刷新:

先定義一個渲染當前國內確診人數的函數,返回pyecharts圖表:


import time, json
import pandas as pd
from pyecharts.charts import Map
import pyecharts.options as opts

def render_mapcountChina_rate(dateId):
    data = pd.read_csv(n)
    data = data[data['dateId'] == dateId]
    #print(data['currentConfirmedCount'])
    list_data = zip(list(data['provinceShortName']), list((data['deadCount']*1000 // data['confirmedCount'])/10))
    # [('湖北', 48206), ('廣東', 1241), ('河南', 1169), ('浙江', 1145), ..., ('澳門', 10), ('西藏', 1)]

    c = (
        Map()
        .add('', list_data, 'china')
        .set_global_opts(
            title_opts=opts.TitleOpts(title='全國疫情分佈圖(死亡率)'+str(dateId)),
            visualmap_opts=opts.VisualMapOpts(is_show=True,
                                            split_number=6,
                                            is_piecewise=True,  # 是否爲分段型
                                            pos_top='center',
                                            pieces=[
                                                    {'min': 40, 'color': '#7f1818'},  #不指定 max
                                                    {'min': 20, 'max': 40},
                                                    {'min': 10, 'max': 20},
                                                    {'min': 8, 'max': 10},
                                                    {'min': 4, 'max': 8},
                                                    {'min': 1, 'max': 4},
                                                    {'min': 0.6, 'max': 1},
                                                    {'min': 0.1, 'max': 0.5},
                                                    {'min': 0, 'max': 0}                                                 
                                                 ]),
        )
    )
    return c

def render_mapcountChina(dateId,type = 0):
    if(type==0):
        return render_mapcountChina_current(dateId)
    elif(type==1):
        return render_mapcountChina_death(dateId)
    elif(type==2):
        return render_mapcountChina_rate(dateId)

在flask中調用該函數:

@app.route("/chinamap",methods=['POST', 'GET'])
def get_china_map():
    if request.method == 'GET':
        maptype = int(request.args.get('type', ''))
        i = int(request.args.get('index', ''))
        print(maptype)
        print(i)
        return render_mapcountChina(date_list[int(i)],maptype).dump_options_with_quotes()

在html頁面中添加:

<div id="current-maps" >
    <div>
        <label>請選擇地圖類型:     </label>
        <select name="select-map" id="mapselecter">
            <option value="0" >現存確診人數</option>
            <option value="1" >累計死亡人數</option>
            <option value="2" >死亡率(死亡/確診)</option>
        </select>
    </div>
    <div>
        <label>拖動滑塊即可切換日期:</label>
        <input id='slider' style="width: 400px;vertical-align: middle;" type='range' min='0' max='121' step='1'/>
    </div>
    <div id="worldMap" class="maps" style="width:800px; height:600px;display: inline-block;"></div>
    <div id="chinaMap" class="maps" style="width:800px; height:600px;display: inline-block;"></div>
</div>

添加js代碼:

document.getElementById('slider').onchange =  function changeDate(){
    fetchworldMapData(worldmap);
    fetchchinaMapData(chinamap);
}

document.getElementById('mapselecter').onchange = function changeCountry(){
    fetchworldMapData(worldmap);
    fetchchinaMapData(chinamap);
}

function fetchworldMapData(chart) {
    $.ajax({
        type: "GET",
        url: "/worldmap",
        dataType: "json",
        data:  "type="+document.getElementById('mapselecter').value+'&'+"index="+document.getElementById('slider').value,
        success: function (result) {
            chart.setOption(result);
        }
    });
}

function fetchchinaMapData(chart) {
    $.ajax({
        type: "GET",
        url: "/chinamap",
        dataType: "json",
        data:  "type="+document.getElementById('mapselecter').value+'&'+"index="+document.getElementById('slider').value,
        success: function (result) {
            chart.setOption(result);
        }
    });
}

分析結果:

通過交互分析可以發現:

  • 現存確診人數圖

    • 在1.20日左右,全國公佈的疫情一開始出現在廣東、湖北、北京上海等地,此時湖北的疫情確診人數已經突破200;
    • 此後,疫情從湖北開始向四周身份成擴散趨勢,在1.26日湖北的確診人數已經突破1000;除湖北外,浙江與廣東確診人數也到達三位數;國外在美國、澳大利亞、法國和泰國等東南亞國家也出現確診病例;
    • 在2.2日前後,湖北的確診人數突破五位數,其他地區疫情人數繼續增加;國外疫情也在歐洲、東南亞、美洲呈緩慢擴散趨勢
    • 在2月中旬,西藏成爲國內首個清零的省份;國外繼續緩慢增長;國內疫情迎來拐點,現存確診人數趨於平緩、不再增加,並開始緩慢減少;現存確診人數約爲50000左右,其中大部分集中在湖北;
    • 二月底三月初,國內確診人數逐漸減少,國外此時開始大規模出現感染並擴散到多個國家;此時意大利、伊朗疫情較爲嚴重;疫情開始擴散到非洲、南美洲;
    • 三月中旬後,國內疫情已經基本得到控制,大多省份恢復到個位數或清零,絕大多數現存確診病例集中在湖北;而世界上大部分國家都已出現確診報告,許多國家突破五位數確診;其中歐洲和伊朗、美國較爲嚴重;
    • 四月初,國內確診人數繼續減少,但有部分省份出現略微反撲;國外疫情幾乎已經擴散到世界所有國家,其中美國確診人數已經突破20萬,是世界最嚴重的地區;
    • 從四月中旬開始,由於外來輸入原因,國內黑龍江及東北地區出現了一次比較嚴重的疫情反撲,確診人數接近500,但在五月初逐步得到控制;
    • 國外疫情在四五月份繼續趨向嚴重,在5.8美國的確診人數突破百萬;但部分早期疫情嚴重的國家由於採取了有效的控制手段導致疫情緩解;
  • 累計死亡人數

    • 二月初,世界各國開始出現死亡病例;
    • 國內的死亡病例數在二月中旬趨向平緩;
    • 在三月中旬,世界各國死亡病例陸續出現或開始明顯增多;
    • 在五月份,報告的死亡數以美國、歐洲最爲嚴重,許多國家死亡人數已經遠遠超過了中國;
  • 死亡率:

    • 死亡率也可以反應出疫情的控制程度,死亡率越低表明患者得到救治的概率越大;
    • 在醫療資源充足的地區,死亡率可以降低到1%左右;醫療資源不足的地區,死亡率可以高達10%;
    • 國內死亡率數據分析:
      • 在一月下旬,中國的死亡率以黑龍江、湖北、湖南河南較爲嚴重,但在一月底二月初除湖北外,其他省份呈下降趨勢;
      • 在國內疫情確診人數峯值的二月中旬,國內平均死亡率爲2.5,死亡率相對較高的是湖北、黑龍江、海南、臺灣等地;
      • 此後,國內湖北的死亡率繼續升高,可能是由於醫療資源不足,無法給予患者有效救治,同時此前積累的確診患者也陸續出現死亡;同樣升高的有新疆、黑龍江;
      • 三月中旬後,在國內疫情基本得到控制的情況下,全國平均死亡率在4%,湖北死亡率達到4.7左右;
      • 在四月中旬補統計了一下之前因爲新冠去世但未計入死亡率數據的死亡人數,最後湖北的死亡率爲6.6,國內平均死亡率在5.5
    • 國外死亡率數據分析:
      • 從三月下旬開始,伴隨着疫情的大規模擴散,各國疫情死亡率也逐步增高;
      • 值得注意的是,許多國家的統計數據表明在其疫情剛開始出現的數日內死亡率是一個高峯,可能表明了在初始階段未能對患者作出良好的檢測和發現,只能從新冠重症患者處得到資料;
      • 雖然非洲等某些不發達國家的疫情報告數據較少,但死亡率較高;可能表明了對於新冠的輕症患者,並沒有良好的檢測能力;
      • 死亡率較高的國家顯著集中在歐洲地區,表明了醫療資源的相對短缺;墨西哥的死亡率也較高;

總體來看:

  • 中國在三月份就逐步控制住了疫情趨勢,爲世界抗疫事業做出了卓越的典範;
  • 歐洲和美洲等發達國家疫情數據較爲嚴重,可能是發達國家在世界範圍內流動的人口較大,但更可能是發達國家能得到有效的檢測並報告病例;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章