用Pyecharts进行疫情数据可视化


疫情地图制作

1.获取相关数据 (网易, 新浪提供的接口并进行分析)

YQ/jsondata.py

# 封装 json 数据类 返回所有需要的数据

# 新浪数据接口
# https://interface.sina.cn/news/wap/fymap2020_data.d.json
# "https://c.m.163.com/ug/api/wuhan/app/data/list-total"
# 由于新浪数据不全 所以用网易补全。
import json
import requests
from django.core.cache import caches


class JsonData:

    # 获取新浪api json 数据
    def get_sina_data(self):
        url = "https://interface.sina.cn/news/wap/fymap2020_data.d.json"
        response = requests.request('get', url=url)
        json_data = json.loads(response.text)
        # with open('json.txt', 'r+') as f:
        #     json_text = f.read()
        # json_data = json.loads(json_text)
        # print(json_data, type(json_data))
        return json_data['data']

    # 获取163中的数据
    def get_163_data(self):
        url = "https://c.m.163.com/ug/api/wuhan/app/data/list-total"
        header = {
            "User-Agent": "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50"
        }
        response = requests.request('get', url=url, headers=header)
        json_data = json.loads(response.text)
        return json_data['data']

    #  获取地方名和累计人数
    def get_old_number(self):
        """

        :return: 各地区的 [名字和人数] 列表
        """
        province_data = []
        json_data = self.get_sina_data()['list']
        for one_data in json_data:
            # 获取各地区名称和感染人数
            province_data.append([
                one_data['name'],
                one_data['value']
            ])
        return province_data

    # 获取当前新冠肺炎感染人数
    def get_now_number(self):
        province_data = []
        json_data = self.get_sina_data()['list']
        for one_data in json_data:
            # 获取各地区名称和当前感染人数
            province_data.append([
                one_data['name'],
                one_data['econNum']
            ])
        return province_data

    # 历史数据 从 1.11 截止到2020年12月14日
    def get_history_list(self):
        json_data_history = self.get_163_data()["chinaDayList"]
        date_x = []
        people_number_y = []
        people_cure_y = []
        people_death_y = []
        people_death_rate = []
        for data in json_data_history:
            date_x.append(data['date'])
            people_number_y.append(data['total']['confirm'])
            people_cure_y.append(data['total']['heal'])
            people_death_y.append(data['total']['dead'])
            people_death_rate.append(data['total']['dead'] / data['total']['confirm'])
        # print(date_x)
        return date_x, people_number_y, people_cure_y, people_death_y, people_death_rate


jsondata = JsonData()
province_data_sum = jsondata.get_old_number()  # 各个地区累计人数
province_data_now = jsondata.get_now_number()  # 各个地区当前人数
province_data_tuple = jsondata.get_history_list()

2.绘制图表

YQ/draw_picture.py

from pyecharts import options as opts
from pyecharts.charts import Map, Page, Tab
from pyecharts.faker import Faker
from pyecharts.components import Table
from pyecharts.charts import Line, Bar, Grid
from pyecharts.globals import ThemeType
from datetime import date
from json_data import province_data_sum, province_data_now
from snapshot_selenium import snapshot
from pyecharts.render import make_snapshot
from json_data import province_data_tuple
from pyecharts.charts import MapGlobe
from pyecharts.faker import POPULATION
from json_data import country_data
import pyecharts.render.templates


# 生成全国疫情确诊人数累计地图
def get_map_old_data() -> map:
    # print(province_data_sum)
    update_date = date.today()
    map = (
        Map(init_opts=opts.InitOpts(theme=ThemeType.WHITE, width='100%', height='900px'))
            .add("各地累计确诊人数", province_data_sum, "china", is_map_symbol_show=False)
            .set_global_opts(
            title_opts=opts.TitleOpts(
                title="新冠状病毒全国疫情地图统计",
                subtitle="更新日期:{}".format(update_date),
            ),
            # 视觉映射配置项
            visualmap_opts=opts.VisualMapOpts(
                is_show=True,  # 是否显示
                min_=0,  # 左下角刻度最小值
                max_=2000,
                range_color=['#FFFFFF', '#F78181', '#FE2E2E', '#FF0000', '#B40404'],  # 颜色过滤配置
            ),
            toolbox_opts=opts.ToolboxOpts(
                is_show=True,
                feature=opts.ToolBoxFeatureOpts(
                    save_as_image=opts.ToolBoxFeatureSaveAsImageOpts(
                        type_='png',
                        name="YQMap",
                        background_color='#FFFFFF',
                        is_show=True,
                        title="保存为图片",
                    ),
                    restore=opts.ToolBoxFeatureRestoreOpts(
                        is_show=False
                    ),
                    data_view=opts.ToolBoxFeatureDataViewOpts(
                        is_show=False
                    ),
                    data_zoom=opts.ToolBoxFeatureDataZoomOpts(
                        is_show=False
                    ),
                    brush=opts.ToolBoxFeatureBrushOpts(
                        type_="clear"
                    )
                )
            ),
        )  # .render('img/全国疫情可视化map.html')
    )
    # make_snapshot(snapshot, map.render(), 'img/全国疫情可视化map.gif')
    return map


# 生成全国疫情当前确诊人数地图
def get_map_now_data() -> map:
    update_date = date.today()
    map = (
        Map(init_opts=opts.InitOpts(theme=ThemeType.WHITE, width='100%', height='900px'))
            .add("各地现确诊人数", province_data_now, "china", is_map_symbol_show=False, is_roam=False)
            .set_global_opts(
            title_opts=opts.TitleOpts(
                title="全国疫情现状地图",
                subtitle="更新日期:{}".format(update_date),
            ),
            # 视觉映射配置项
            visualmap_opts=opts.VisualMapOpts(
                is_show=True,  # 是否显示
                min_=0,  # 左下角刻度最小值
                max_=150,
                range_color=['#FFFFFF', '#F78181', '#FE2E2E', '#FF0000', '#B40404']  # 颜色过滤配置
            ),
            toolbox_opts=opts.ToolboxOpts(
                is_show=True,
                feature=opts.ToolBoxFeatureOpts(
                    save_as_image=opts.ToolBoxFeatureSaveAsImageOpts(
                        type_='png',
                        name="YQMap",
                        background_color='#FFFFFF',
                        is_show=True,
                        title="保存为图片",
                    ),
                    restore=opts.ToolBoxFeatureRestoreOpts(
                        is_show=False
                    ),
                    data_view=opts.ToolBoxFeatureDataViewOpts(
                        is_show=False
                    ),
                    data_zoom=opts.ToolBoxFeatureDataZoomOpts(
                        is_show=False
                    ),
                    brush=opts.ToolBoxFeatureBrushOpts(
                        type_="clear"
                    )
                )
            ),
        )
    )
    # make_snapshot(snapshot, map.render(), 'img/全国疫情可视化map1.gif')
    return map


# 生成折线统计图
def get_line_pic() -> Line:
    c = (
        Line(init_opts=opts.InitOpts(width="100%",
                                     # 设置动画
                                     animation_opts=opts.AnimationOpts(
                                         animation_delay=1000,
                                         animation_duration=10000,
                                     )
                                     ))
            .add_xaxis(province_data_tuple[0])
            .add_yaxis(
            "累计感染人数",
            province_data_tuple[1],
            # areastyle_opts=opts.AreaStyleOpts(opacity=0.5),
            label_opts=opts.LabelOpts(is_show=False),
        )
            .add_yaxis(
            "累计治愈人数",
            province_data_tuple[2],
            # areastyle_opts=opts.AreaStyleOpts(opacity=0.5),
            label_opts=opts.LabelOpts(is_show=False),
        )
            .add_yaxis(
            "累计死亡人数",
            province_data_tuple[3],
            # areastyle_opts=opts.AreaStyleOpts(opacity=0.5),
            label_opts=opts.LabelOpts(is_show=False),
        )
            .set_global_opts(
            title_opts=opts.TitleOpts(title="新冠肺炎走势图"),
            toolbox_opts=opts.ToolboxOpts(
                is_show=True,
                feature=opts.ToolBoxFeatureOpts(
                    save_as_image=opts.ToolBoxFeatureSaveAsImageOpts(
                        type_='png',
                        name="YQLine",
                        background_color='#FFFFFF',
                        is_show=True,
                        title="保存为图片",
                    ),
                    restore=opts.ToolBoxFeatureRestoreOpts(
                        is_show=False
                    ),
                    data_view=opts.ToolBoxFeatureDataViewOpts(
                        is_show=False
                    ),
                    data_zoom=opts.ToolBoxFeatureDataZoomOpts(
                        is_show=False
                    ),
                    brush=opts.ToolBoxFeatureBrushOpts(
                        type_="clear"
                    )
                )
            ),
        )
    )
    # make_snapshot(snapshot, c, 'img/全国疫情可视化line.gif')
    return c


# 生成死亡率 治愈率折线图
def get_rate_line_pic() -> Line:
    line = (
        Line(init_opts=opts.InitOpts(width="100%",
                                     # 设置动画
                                     animation_opts=opts.AnimationOpts(
                                         animation_delay=1000,
                                         animation_duration=10000,
                                     )
                                     ))
            .add_xaxis(province_data_tuple[0])
            .add_yaxis("新冠肺炎感染人数死亡率",
                       province_data_tuple[4],
                       label_opts=opts.LabelOpts(is_show=False)
                       )
            .add_yaxis("新冠肺炎感染人数治愈率",
                       province_data_tuple[5],
                        label_opts=opts.LabelOpts(is_show=False)
                       )
            .set_global_opts(
            title_opts=opts.TitleOpts(title="新冠肺炎感染人数治愈率和死亡率"),
            toolbox_opts=opts.ToolboxOpts(
                is_show=True,
                feature=opts.ToolBoxFeatureOpts(
                    save_as_image=opts.ToolBoxFeatureSaveAsImageOpts(
                        type_='png',
                        name="YQLineRate",
                        background_color='#FFFFFF',
                        is_show=True,
                        title="保存为图片",
                    ),
                    restore=opts.ToolBoxFeatureRestoreOpts(
                        is_show=False
                    ),
                    data_view=opts.ToolBoxFeatureDataViewOpts(
                        is_show=False
                    ),
                    data_zoom=opts.ToolBoxFeatureDataZoomOpts(
                        is_show=False
                    ),
                    brush=opts.ToolBoxFeatureBrushOpts(
                        type_="clear"
                    )
                )
            ),
        )
    )
    return line


# 生成动态柱状图
def bar_datazoom_slider() -> Bar:
    c = (
        Bar(init_opts=opts.InitOpts(width='100%'))
            .add_xaxis(province_data_tuple[0])
            # 不显示数据
            .add_yaxis("感染人数", province_data_tuple[1], label_opts=opts.LabelOpts(is_show=False))
            .add_yaxis("治愈人数", province_data_tuple[2], label_opts=opts.LabelOpts(is_show=False))
            .add_yaxis("死亡人数", province_data_tuple[3], label_opts=opts.LabelOpts(is_show=False))
            .set_global_opts(
            title_opts=opts.TitleOpts(title="新冠肺炎感染人数"),
            #  锁定区域
            datazoom_opts=[opts.DataZoomOpts(
                    range_start=0,
                    range_end=20,
            )],
        )
    )
    return c


# 获取全球疫情地图
def get_world_map():
    c = (
        MapGlobe(init_opts=opts.InitOpts(width="100%", height="700px", bg_color="#2E9AFE"))
            .add_schema()
            .add(
            maptype="world",
            series_name="World Population",
            data_pair=country_data,
            is_map_symbol_show=False,
            label_opts=opts.LabelOpts(is_show=True),
            tooltip_opts=opts.TooltipOpts(
                is_show=True
            )
        )
            .set_global_opts(
            title_opts=opts.TitleOpts(
                title="全球疫情可视化地图",
            ),
            visualmap_opts=opts.VisualMapOpts(
                min_=0,
                max_=1000000,
                range_text=["max", "min"],
                is_calculable=True,
                range_color=["#F5DA81", "#FAAC58", "#FE642E", "#DF0101"],
            ),
        )
    )
    c.render('app01/templates/world.html')


# 生成组合图标
def page_simple_layout():
    page = Page(layout=Page.SimplePageLayout)
    page.add(
        get_map_old_data(),
        get_map_now_data(),
        get_line_pic(),
        bar_datazoom_slider(),
        get_rate_line_pic(),
        # get_world_map(),
    )
    page.render('app01/templates/全国疫情可视化汇总图.html')

3.效果展示



免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM