【数据可视化】pyecharts实现全国和全球疫情可视化

实验目的和要求

在本次实验中基于当前的疫情数据完成各种可视化的构建:

(1)对全国总数据绘制饼图;

(2)对全国各地数据进行地图的绘制

(3)对全国的确诊人数做词云图

(4)对山东(湖北)的确诊人数做词云图

(5)进行更复杂的全国(全球)疫情地图的绘制

博客链接:https://www.iamzlt.com/?p=251

前导内容

安装pyecharts

1、进入官网或点击这里下载安装包Pyecharts 下载最新版本

2、将Pyecharts 文件放到Anaconda3 的pkgs 目录下

3、打开Anaconda Prompt,输入cd anaconda3/pkgs 进入文件夹

5 继续安装插件

$ pip install echarts-countries-pypkg 全球国家地图
$ pip install echarts-china-provinces-pypkg 中国省份地图
$ pip install echarts-china-cities-pypkg 中国城市地图
$ pip install wordcloud 词云图包

实验内容一

全国数据绘制饼图,keshihua.py文件

1.获取数据

import json
import requests

def catch_data():
    url = 'https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5'
    reponse = requests.get(url=url).json()
    data = json.loads(reponse['data'])
    return data

if __name__ == '__main__':
    data = catch_data()
    print(data.keys())
    lastUpdateTime = data['lastUpdateTime']
    chinaTotal= data['chinaTotal']
    chinaAdd = data['chinaAdd']
    print(chinaTotal)
    print(chinaAdd)

运行结果:

dict_keys(['lastUpdateTime', 'chinaTotal', 'chinaAdd', 'isShowAdd', 'showAddSwitch', 'areaTree'])
{'confirm': 84407, 'heal': 79209, 'dead': 4643, 'nowConfirm': 555, 'suspect': 5, 'nowSevere': 26, 'importedCase': 1678, 'noInfect': 903}
{'confirm': 3, 'heal': 83, 'dead': 0, 'nowConfirm': -80, 'suspect': 3, 'nowSevere': -3, 'importedCase': 2, 'noInfect': 20}

2.对总数据进行饼图绘制

import json
import requests

def catch_data():
    url = 'https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5'
    reponse = requests.get(url=url).json()
    data = json.loads(reponse['data'])
    return data
    
from pyecharts.charts import Pie
from pyecharts import options as opts

def create_pie():
    data = catch_data()
    lastUpdateTime = data['lastUpdateTime']
    chinaTotal= data['chinaTotal']
    
    #创建实例对象
    pie = Pie(init_opts=opts.InitOpts(width='1000px',height='600px'))
    
    #添加数据
    pie.add(series_name='腾讯数据', data_pair=[list(z) for z in zip(chinaTotal.keys(), chinaTotal.values())])
        
    #设置全局项
    pie.set_global_opts(title_opts=opts.TitleOpts(title='全国总数据',pos_left='center',pos_top=20))
    #设置每项数据战机
    pie.set_series_opts(tooltip_opts=opts.TooltipOpts(trigger='item', formatter="{a} <br/> {b}:{c}"))
    
    pie.render(path="Bing1.html")

if __name__ == '__main__':
    
    create_pie()
    
    '''
    data = catch_data()
    print(data.keys())
    lastUpdateTime = data['lastUpdateTime']
    chinaTotal= data['chinaTotal']
    chinaAdd = data['chinaAdd']
    print(chinaTotal)
    print(chinaAdd)
    '''

运行结果:Bing1

     

Todo 工作:

(1)把上面饼图的 confirm 等字样 改成中文

import json
import requests

def catch_data():
    url = 'https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5'
    reponse = requests.get(url=url).json()
    data = json.loads(reponse['data'])
    return data
    
from pyecharts.charts import Pie
from pyecharts import options as opts

def create_pie():
    data = catch_data()
    lastUpdateTime = data['lastUpdateTime']
    chinaTotal= data['chinaTotal']
    print(chinaTotal.keys())
    chinaTotal_en = {}
    key_en = ['确诊','治愈','死亡','现有确诊','疑似感染','现有重症','重症','无症状感染者']
    i = 0 
    for key, value in zip(chinaTotal.keys(), chinaTotal.values()):
        chinaTotal_en[key_en[i]] = value
        i+=1;
    #创建实例对象
    pie = Pie(init_opts=opts.InitOpts(width='1000px',height='600px'))
    
    #添加数据
    pie.add(series_name='腾讯数据', data_pair=[list(z) for z in zip(chinaTotal_en.keys(), chinaTotal.values())])
        
    #设置全局项
    pie.set_global_opts(title_opts=opts.TitleOpts(title='全国总数据',pos_left='center',pos_top=20))
    #设置每项数据战机
    pie.set_series_opts(tooltip_opts=opts.TooltipOpts(trigger='item', formatter="{a} <br/> {b}:{c}"))
    
    pie.render(path="Bing1.html")

if __name__ == '__main__':
    
    create_pie()
    #data.keys()=['上次更新','总和','增加','','','','']
    
    #data = catch_data()
    #print(data.keys())
    #lastUpdateTime = data['lastUpdateTime']
    #chinaTotal= data['chinaTotal']
    #chinaAdd = data['chinaAdd']
    #print(chinaTotal)
    #print(chinaAdd)

运行结果:Bing1

     

(2)再编写函数对chinaAdd(新增数据)进行绘制,并去掉其中的某个项目,比如heal

import json
import requests

def catch_data():
    url = 'https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5'
    reponse = requests.get(url=url).json()
    data = json.loads(reponse['data'])
    return data
    
from pyecharts.charts import Pie
from pyecharts import options as opts

def create_pie():
    data = catch_data()
    lastUpdateTime = data['lastUpdateTime']
    chinaAdd= data['chinaAdd']
    chinaTotal_en = {}
    del(chinaAdd['suspect'])
    #创建实例对象
    pie = Pie(init_opts=opts.InitOpts(width='1000px',height='600px'))
    
    #添加数据
    pie.add(series_name='腾讯数据', data_pair=[list(z) for z in zip(chinaAdd.keys(), chinaAdd.values())])
        
    #设置全局项
    pie.set_global_opts(title_opts=opts.TitleOpts(title='全国总数据',pos_left='center',pos_top=20))
    #设置每项数据战机
    pie.set_series_opts(tooltip_opts=opts.TooltipOpts(trigger='item', formatter="{a} <br/> {b}:{c}"))
    
    pie.render(path="Bing2.html")

if __name__ == '__main__':
    
    create_pie()

运行结果:Bing2

      

(3)从其他网站下载全球疫情数据,并将其绘制成饼图

# -*- coding: utf-8 -*-
"""
Created on Wed May  6 16:55:30 2020

@author: ZLT
"""

import json
import requests
import pandas as pd
import time

def time_c(timeNum):
    timeTemp = float(timeNum/1000)
    tupTime = time.localtime(timeTemp)
    stadardTime = time.strftime("%Y-%m-%d %H:%M:%S", tupTime)
    return stadardTime

def catch_data():
    url = 'https://lab.isaaclin.cn/nCoV/api/area?latest=0'
    data = requests.get(url=url).json()
    res = data['results']
    df = pd.DataFrame(res)
    for i in range(len(df)):
        df.iloc[i,16] = time_c(df.iloc[i,16])
    for i in range(len(df)):
        df.iloc[i,15] = df.iloc[i,16][5:10]
    df1 = df
    df2 = df1.drop_duplicates(['updateTime'],keep='last')
    date = []
    for i in range(len(df2)):
        date.append(df2.iloc[i,16])
    #print(date)
    tem = df1[df1['updateTime'] == '05-14']
    tem = tem.drop_duplicates(['provinceShortName'], keep='last')
    for i in date[1:41]:
        tem1 = df1[df1['updateTime'] == i]
        tem1= tem1.drop_duplicates(['provinceShortName'],keep='last')
        tem = tem.append(tem1)
    tem = tem.reset_index(drop=True)
    #print(tem)
    tem = tem[tem['cities'] == '05-14']
    print(tem)
    world_dict={}
    keys = ['currentConfirmedCount','confirmedCount','suspectedCount','curedCount','deadCount']
    for i in range(len(keys)):
        world_dict[keys[i]]=0
    print(world_dict)
    
    for i in range(len(keys)):
        #print(tem[keys[i]])
        world_dict[keys[i]] = sum(tem[keys[i]])
    print(world_dict)
    return world_dict
    
from pyecharts.charts import Pie
from pyecharts import options as opts

def create_pie():
    data = catch_data()

    #创建实例对象
    pie = Pie(init_opts=opts.InitOpts(width='1000px',height='600px'))
    
    #添加数据
    pie.add(series_name='数据', data_pair=[list(z) for z in zip(data.keys(), data.values())])
        
    #设置全局项
    pie.set_global_opts(title_opts=opts.TitleOpts(title='全球总数据',pos_left='center',pos_top=20))
    #设置每项数据战机
    pie.set_series_opts(tooltip_opts=opts.TooltipOpts(trigger='item', formatter="{a} <br/> {b}:{c}"))
    
    pie.render(path="Bing3.html")

if __name__ == '__main__':
    #data = catch_data()
    create_pie()

运行结果:Bing3

       

实验内容二

全国各地数据进行地图绘制 keshihua2.py
 
import json
import requests
import pandas as pd
import time
from pyecharts.charts import Map
import pyecharts.options as opts

def catch_data():
    url = 'https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5'
    reponse = requests.get(url=url).json()
    data = json.loads(reponse['data'])
    return data

data = catch_data()
print(data.keys())

lastUpdateTime = data['lastUpdateTime']

areaTree = data['areaTree']

china_data = areaTree[0]['children']
china_list = []

for a in range(len(china_data)):
    province = china_data[a]['name']
    province_list = china_data[a]['children']
    for b in range(len(province_list)):
        city = province_list[b]['name']
        total = province_list[b]['total']
        today = province_list[b]['today']
        china_dict = {}
        china_dict['province'] = province
        china_dict['city'] = city
        china_dict['total'] = total
        china_dict['today'] = today
        china_list.append(china_dict)

china_data = pd.DataFrame(china_list)

def confirm(x):
    confirm = eval(str(x))['confirm']
    return confirm

def dead(x):
    dead = eval(str(x))['dead']
    return dead

def heal(x):
    heal = eval(str(x))['heal']
    return heal

china_data['confirm'] = china_data['total'].map(confirm)
china_data['dead'] = china_data['total'].map(dead)
china_data['heal'] = china_data['total'].map(heal)
china_data = china_data[["province","city","confirm","dead","heal"]]

#print(china_data.head())
#print(china_data)

area_data = china_data.groupby("province")["confirm"].sum().reset_index()
area_data.columns = ["province", "confirm"]
print(area_data)

(
     Map()
         .add("", [list(z) for z in zip(list(area_data["province"]), list(area_data["confirm"]))], "china",
              is_map_symbol_show=False)
         .set_global_opts(title_opts=opts.TitleOpts(title="2019_nCov中国各地总确诊人数地图"),
                          visualmap_opts=opts.VisualMapOpts(is_piecewise=True,
                                                        pieces=[
                                                            {"min": 5000, "label":'&gt;5000', "color":"#893448"},
                                                            {"min": 1000, "max": 4999, "label":'1000~4999', "color":"#ff585e"},
                                                            {"min": 500, "max":999, "label":'500~1000', "color":"#fb8146"},
                                                            {"min": 101, "max":499, "label":'101~499', "color":"#ffA500"},
                                                            {"min": 10, "max":99, "label":'10~100', "color":"#ffb248"},
                                                            {"min": 0, "max":9,"label":'0~9', "color":"#fff2d1"}
                                                            ]
                                                            ))
         
 

).render(path="Bing4.html")


运行结果:Bing4

       

实验内容三

对全国确诊人数做词云图

1 保存csv 数据(还是keshihua2.py, 在中间 加入一行代码 再运行生成csv)

area_data.to_csv('china.csv', index=False)

2 制作词云图(新建keshihua3.py)

import pandas as pd
from wordcloud import WordCloud, ImageColorGenerator
import matplotlib.pyplot as plt

def draw_cloud(read_name):
    wc = WordCloud(font_path='simkai.ttf', background_color="white")
    fp = pd.read_csv(read_name, encoding='utf-8')
    name = list(fp.province)
    value = fp.confirm
    for i in range(len(name)):
        name[i] = str(name[i])
    dic = dict(zip(name, value))
    wc.generate_from_frequencies(dic)
    
    plt.imshow(wc)
    plt.axos("off")
    wc.to_file('china.png')
    
if __name__ == '__main__':
    draw_cloud('china.csv')
    

运行结果:

Todo 工作:生成的 csv 文件虽然在词云图中没有问题,但是用execl 等程序打开后,省名确实乱码,请优化使之用excel 打开后仍然可读。

area_data.to_csv('china.csv', index=False, encoding='utf-8-sig')

实验内容四

对山东(湖北)省确诊人数做词云图

1 保存csv 数据(还是keshihua2.py)

shandong_data=china_data.loc[china_data.province=='山东',['city','confirm']]
shandong_data.to_csv('shandong.csv',index=False,encoding='utf-8-sig')

2 绘制词云图(todo 在keshihua2.py 基础上改动实现)

import pandas as pd
from wordcloud import WordCloud, ImageColorGenerator
import matplotlib.pyplot as plt

def draw_cloud(read_name):
    wc = WordCloud(font_path='simkai.ttf', background_color="white")
    fp = pd.read_csv(read_name, encoding='utf-8')
    name = list(fp.city)
    value = fp.confirm
    for i in range(len(name)):
        name[i] = str(name[i])
    dic = dict(zip(name, value))
    wc.generate_from_frequencies(dic)
    
    plt.imshow(wc)
    plt.axis("off")
    wc.to_file('china.png')
    
if __name__ == '__main__':
    draw_cloud('shandong.csv')

运行结果:

实验内容五

在实验三的基础上生成一个动态的,显示所有信息的地图(keshihua4.py)

1 选定json 网址

https://ncportal.esrichina.com.cn/JKZX/yq_20200131.json 为了简单,直接使用20200131这一天的数据,该json 的结构请打开网页查看

import time
import json
import requests
import datetime
import pandas as pd
import numpy as np
from pyecharts.charts import Map
from pyecharts import options as opts

infoType = ['新增疑似', '累计疑似', '新增确诊', '累计确诊', '新增死亡', '累计死亡']
date = 0
def getInfo(types, results):
    #从字典中获取types信息(types in infoType)
    rDict = {}
    for item in results:
        rDict[item['name']] = item[types]
    return rDict

def formatProvince(proName):
    if proName.endswith('省') or proName.endswith('市'):
        return proName[:-1]
    elif proName == '内蒙古自治区':
        return '内蒙古'
    elif proName.endswith('自治区'):
        return proName[:2]
    elif proName.endswith('行政区'):
        return proName[:2]

def mapVisualmap(iType=infoType):
    #定义一个Map类
    c = Map()
    
    #设置图例显示列表
    pieces = []
    
    #获取网页内容
    result = getResult()[0]
    #返回时间信息
    
    #遍历项目类型
    for i in range(len(iType)):
        #将每一组数据添加到类c中
        rDict = getInfo(iType[i], result)
        c.add('{}'.format(iType[i]), [list(z) for z in zip([formatProvince(i) for i in rDict.keys()], 
              list(rDict.values()))], 'china')
        
        #将每一组数据中的最大最小值作为每一个图例区间
        pieces.append({'min': min(rDict.values()), 'max': max(rDict.values())})
        
    #设置类Map的全局属性,标题属性,visualmap属性,图例属性
    c.set_global_opts(
            title_opts=opts.TitleOpts(title="全国各省份疫情感染情况(截止:{})".format(date), pos_top=15, pos_right='center'),
            visualmap_opts=opts.VisualMapOpts(is_piecewise=True, pieces=pieces, type_= 'color'), 
            legend_opts=opts.LegendOpts(selected_mode='single', orient='vertical', pos_right=40, pos_top=40))
    return c


def formatProvince(proName):
    if proName.endswith('省') or proName.endswith('市'):
        return proName[:-1]
    elif proName == '内蒙古自治区':
        return '内蒙古'
    elif proName.endswith('自治区'):
        return proName[:2]
    elif proName.endswith('行政区'):
        return proName[:2]

def getResult():
    url = "https://ncportal.esrichina.com.cn/JKZX/yq_{}.json"
    headers = {'User-Agent': 'Mozilla/5.0 (windows NT 10.0; Win64; x64)'}
    global date
    date = 20200131
    print(url.format(date))
    
    req = requests.get(url.format(date), headers=headers)
    
    provinceInfo = []
    for i in range(34):
        provinceInfo.append(req.json()['features'][i]['properties'])
        
    return provinceInfo, date
    #返回各省、自治区、直辖市及港澳台的全部数据

if __name__ == '__main__':
    c = mapVisualmap()
    c.render(path="全国各省份疫情感染情况.html")

运行结果:全国各省份疫情感染情况

        

项目实战:绘制世界动态疫情地图:生成如下所示的html 文件

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

def time_c(timeNum):
    timeTemp = float(timeNum/1000)
    tupTime = time.localtime(timeTemp)
    stadardTime = time.strftime("%Y-%m-%d %H:%M:%S", tupTime)
    return stadardTime

def catch_data():
    url = 'https://lab.isaaclin.cn/nCoV/api/area?latest=0'
    data = requests.get(url=url).json()
    res = data['results']
    df = pd.DataFrame(res)
    for i in range(len(df)):
        df.iloc[i,16] = time_c(df.iloc[i,16])
    for i in range(len(df)):
        df.iloc[i,15] = df.iloc[i,16][5:10]
    df1 = df
    df2 = df1.drop_duplicates(['updateTime'],keep='last')
    date = []
    for i in range(len(df2)):
        date.append(df2.iloc[i,16])
    #print(date)
    tem = df1[df1['updateTime'] == '05-14']
    tem = tem.drop_duplicates(['provinceShortName'], keep='last')
    for i in date[1:41]:
        tem1 = df1[df1['updateTime'] == i]
        tem1= tem1.drop_duplicates(['provinceShortName'],keep='last')
        tem = tem.append(tem1)
    tem = tem.reset_index(drop=True)
    #print(tem)
    tem = tem[tem['cities'] == '05-14']
    print(tem)
    tem.to_csv('world_5_14.csv',index=False,encoding='utf-8-sig')
    return tem


if __name__ == '__main__':
    area_data = catch_data()
    #create_pie()
    (
     Map()
         .add("", [list(z) for z in zip(list(area_data["countryEnglishName"]), list(area_data["currentConfirmedCount"]))], "world",
              is_map_symbol_show=False)
         .set_global_opts(title_opts=opts.TitleOpts(title="2019_nCov世界各地现确诊人数地图"),
                          visualmap_opts=opts.VisualMapOpts(is_piecewise=True,
                                                        pieces=[
                                                            {"min": 5000, "label":'>5000', "color":"#893448"},
                                                            {"min": 1000, "max": 4999, "label":'1000~4999', "color":"#ff585e"},
                                                            {"min": 500, "max":999, "label":'500~1000', "color":"#fb8146"},
                                                            {"min": 101, "max":499, "label":'101~499', "color":"#ffA500"},
                                                            {"min": 10, "max":99, "label":'10~100', "color":"#ffb248"},
                                                            {"min": 0, "max":9,"label":'0~9', "color":"#fff2d1"}
                                                            ]
                                                            ))
         .set_series_opts(label_opts=opts.LabelOpts(is_show=False))

    ).render(path="全球疫情.html")

运行结果:全球疫情

         
  • 8
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值