pyecharts 疫情可视化数据可视化(二)

夙愿已清 提交于 2020-04-07 11:24:47

因为之前写的接口改了,更新了下

一:数据准备阶段

此次数据所有来源均从这两个地方得到
1.腾讯各省份市的疫情接口
2.腾讯疫情历史每日数据接口和国外疫情数据接口

二:工具和环境

IDE:Pycharm

第三方模块
1.json 主要功能:处理接口数据
2.requests 主要功能:获取接口数据
3.pandas 主要功能:将数据保存为csv
4.datetime 主要功能:文件保存时间
5.pyecahrts 主要功能:数据可视化制作地图等 版本1.7.0
6.flask 主要功能:web展示





环境 python3.7

浏览器:Chrome浏览器

三 绘制地图

获取数据方法

返回的是数据需要进行转换 json.loads方法是把json对象转化为python对象

    def getdata(self):
        r = requests.get(self.url).json()


        data = json.loads(r['data'])
        return data

1.多国累计确诊趋势折线图

lines =(
        Line()

        .add_xaxis([x.strftime('%Y-%m-%d') for x in list(pd.date_range(start='2020-02-25', end=datetime.date.today()))])
        .add_yaxis('伊朗',y_axis=list(df_yilang['confirm'])[6:])
        .add_yaxis('加拿大',list(df_jianada['confirm'])[28:])
        .add_yaxis('德国',list(df_deguo['confirm'])[28:])
        .add_yaxis('意大利',list(df_yidali['confirm'])[25:])
        .add_yaxis('日本本土',list(df_ribenbentu['confirm'])[28:])
        .add_yaxis('法国',list(df_faguo['confirm'])[28:])
        .add_yaxis('美国',list(df_meiguo['confirm'])[28:])
        .add_yaxis('英国',list(df_yingguo['confirm'])[25:])
        .add_yaxis('西班牙',list(df_xibanya['confirm'])[24:])
        .add_yaxis('韩国',list(df_hanguo['confirm'])[28:])
        .set_global_opts(
            title_opts = opts.TitleOpts(title='多国累计确诊趋势'),
            datazoom_opts= opts.DataZoomOpts(
                is_show=True,#显示
                is_realtime=True,#拖动时,是否实时更新系列的视图。如果设置为 false,则只在拖拽结束的时候更新。
                range_end= 60, # 数据窗口范围的结束百分比。
            ),
            tooltip_opts= opts.TooltipOpts(
                is_show=True,
                trigger='axis', #坐标轴触发,主要在柱状图和折线图使用
                trigger_on='mousemove|click', #同时鼠标移动和点击时触发。
            ),
            # toolbox_opts=opts.ToolboxOpts(
            #     is_show=True,  # 是否显示提示框组件,包括提示框浮层和axisPointer。
            # )
        )
        .render('./templates/多国累计确诊趋势折线图.html')
    )

这里面要注意的是x轴的数据必须是str类型不然会画出来的图有问题,亲测。呜呜呜呜

.add_xaxis([x.strftime('%Y-%m-%d') for x in list(pd.date_range(start='2020-02-25', end=datetime.date.today()))])

这行代码是 列表推导式生成一个时间段的有序数列,利用pandas里面的data_range
效果图
在这里插入图片描述

2.全球历史每日信息折线图

参数可以自己选择

"""
        name conrirm 确诊数
        heal 治愈
        dead	死亡
        addcnfirm	增加确诊数
        """
    def globalDailyHistory(self, name):
        data = self.getdata()
        print(name)
        newAddConfirmList = []
        for i in data['globalDailyHistory'][:-1]:
            item = {
                'date': i['date'],
                name: i['all'][name]
            }
            newAddConfirmList.append(item)
        df = pd.DataFrame(newAddConfirmList)
        print(df)
        line = (
            Line()
                .add_xaxis(list(df['date']))
                .add_yaxis(series_name=name, y_axis=list(df[name]))
                .set_global_opts(
                title_opts=opts.TitleOpts(title='全球历史%s信息(不包括中国)'%name),
                datazoom_opts=opts.DataZoomOpts(
                    is_show=True,  #
                    is_realtime=True,  # 拖动时,是否实时更新系列的视图。如果设置为 false,则只在拖拽结束的时候更新。
                    range_end=80,  # 数据窗口范围的结束百分比。
                    range_start=50
                ),
                tooltip_opts=opts.TooltipOpts(
                    is_show=True,
                    trigger='axis',  # 坐标轴触发,主要在柱状图和折线图使用
                    trigger_on='mousemove|click',  # 同时鼠标移动和点击时触发。
                ),
            )
                .render('./templates/全球历史{}信息.html'.format(name))
        )

在这里插入图片描述
在这里插入图片描述

中国现有确诊人数地图

data = self.getdata()
        province_list = []
        for i in data['importStatis']['TopList']:
            item = {
                'province':i['province'],
                'importedCase':i['importedCase']
            }
            province_list.append(item)
        df = pd.DataFrame(province_list)
        print(df)
        map = (
            Map(init_opts=opts.InitOpts(width="1500px", height="1500px", theme=ThemeType.DARK)) #地图规格  init_opts=opts.InitOpts(width='1000', height='1000')
            .add(
                '中国',
                [list(z) for z in zip(list(df["province"]), list(df['importedCase']))],
                'china',
                is_map_symbol_show=False,
            )
            .set_global_opts(
                title_opts= opts.TitleOpts('中国省份现有全确诊人数'),
                visualmap_opts=opts.VisualMapOpts(
                    max_=200, #显示颜色
                    is_piecewise=True,  # 颜色是否分段显示(False为渐变,True为分段)

                ),
                tooltip_opts=opts.TooltipOpts(
                    is_show=True,  # 显示
                    trigger_on='mousemove|click',  # 鼠标点击或者移动到出现具体的数值

                ),

            )
            .render('./templates/中国省份现有全确诊人数.html')
        )

没啥好说的就是提取数据进行处理然后map画图即可,参数也给标注了
在这里插入图片描述

4今日新增国家确诊前十Bar(X-Y轴互换)

参数 .reversal_axis() #翻转xy轴

data = self.getdata()

        countryList = []
        for i in data['countryAddConfirmRankList']:
            item = {
                'nation':i['nation'],
                'addConfirm':i['addConfirm']
            }
            countryList.append(item)
        df = pd.DataFrame(countryList)

        #Bar翻转xy轴
        bar = (
            Bar()
            .add_xaxis(list(df['nation']))
            .add_yaxis('国家新增数量',list(df['addConfirm']))
            .reversal_axis() #翻转xy轴
            .set_series_opts(label_opts=opts.LabelOpts(position="right"))
            .set_global_opts(title_opts=opts.TitleOpts(title="今日新增国家数量"))
            .render("./templates/今日国家新增数量.html")
        )

在这里插入图片描述

5各大洲柱状图bar(stack)图

需要注意的是
stack是进行堆放在一起的stack1堆放一个,stack2等于二个
嗯 就是这样

statisList = []
        for i in data['continentStatis'][1:]:
            item = {
                'date':i['date'],
                '亚洲':i['statis']['亚洲'] ,
                '其他':i['statis']['其他'],
                '北美洲':i['statis']['北美洲'],
                '大洋洲':i['statis']['大洋洲'],
                '欧洲':i['statis']['欧洲'],
                '非洲':i['statis']['非洲'] if i['statis'].get('非洲') else 0,
                '南美洲':i['statis']['南美洲'] if i['statis'].get('南美洲') else 0,
            }
            statisList.append(item)
        df = pd.DataFrame(statisList)

        bar_stack = (
            Bar()
            .add_xaxis(list(df['date']))
            .add_yaxis('亚洲',list(df['亚洲']),stack='stack1')
            .add_yaxis('其他',list(df['其他']),stack='stack1')
            .add_yaxis('北美洲',list(df['北美洲']),stack='stack1')
            .add_yaxis('大洋洲',list(df['大洋洲']),stack='stack1')
            .add_yaxis('欧洲',list(df['欧洲']),stack='stack1')
            .add_yaxis('南美洲',list(df['南美洲']),stack='stack1')
            .add_yaxis('海外现有确诊',[1718,6210,23190,67493,201196,503530])
            .set_series_opts(label_opts=opts.LabelOpts(is_show=False))
            .set_global_opts(title_opts=opts.TitleOpts(title="海外现有确诊及各洲累计确诊周比"),
                             tooltip_opts=opts.TooltipOpts(
                                 is_show=True,
                                 trigger='axis',  # 坐标轴触发,主要在柱状图和折线图使用
                                 trigger_on='mousemove|click',  # 同时鼠标移动和点击时触发。
                             ))
            .render("./templates/各大洲柱状图.html")
        )

在这里插入图片描述
嗯 到了今天的压轴的图了,其实也不是啥别的。就是他长 emmm 细品(容我皮下)

不啰嗦,直接正题

6世界地图和table格式显示

数据准备

有些东西可以自己添加,看自己需求。

 item = {
            '国家中':i['name'],  # 国家
            '国家英':item_contry[i['name']] if i['name'] in item_contry else i['name'], # 如果没有国家英就显示原来的名字
            # '大洲':i['continent'], # 大洲
            # '日期':i['date'], # 日期
            # '是否更新':i['isUpdated'], # 是否更新
            '新增确诊':i['confirmAdd'], # 新增确诊
            # '确认':i['confirmAddCut'], #确认
            '总确诊':i['confirm'], # 总确诊
            '疑似':i['suspect'], # 疑似
            '死亡':i['dead'], # 死亡
            '治愈':i['heal'], # 治愈
            '现有确诊':i['confirm'], # 现有确诊
            # '证实':i['confirmCompare'], # 证实
            # '新增证实':i['nowConfirmCompare'], # 新增证实
            # '治愈证实':i['healCompare'], #治愈证实
            # '死亡证实':i['deadCompare'], # 死亡证实
        }
        countryList.append(item)
    countryList.append(getchinadata())
    df = pd.DataFrame(countryList)
    
'国家英':item_contry[i['name']] if i['name'] in item_contry else i['name'], # 如果没有国家英就显示原来的名字

自己定义了一个中英国家字典,但是因为像 钻石公主号这样 的没有就要加个if 语句了

6世界地图

pieces 里面是自定义显示颜色,我换个颜色累死了。你们肯定比我厉害。

map =(
        Map(init_opts=opts.InitOpts(width="1500px", height="1500px", theme=ThemeType.DARK))
            .add("国家", [list(z) for z in zip(list(df['国家英']),list(df['总确诊']))], "world")
            .set_series_opts(label_opts=opts.LabelOpts(is_show=False))
        .set_global_opts(
            title_opts=opts.TitleOpts(title='世界疫情确诊地图'), # 标题
            visualmap_opts=opts.VisualMapOpts(
                max_=500000,
                is_piecewise=True,  # 颜色是否分段显示(False为渐变,True为分段)
                pieces=[

                    {"min": 1, "max": 10, "label": "1-10人以下", "color": "#FFE6BE"},
                    {"min": 10, "max": 49, "label": "10-49人", "color": "#FFB769"},
                    {"min": 50, "max": 99, "label": "50-99人", "color": "#FF8F66"},
                    {"min": 100, "max": 499, "label": "100-499人", "color": "#ED514E"},
                    {"min": 500, "max": 999, "label": "500-999人", "color": "#CA0D11"},
                    {"min": 1000, "max": 9999, "label": "1000-9999人", "color": "#C23531"},
                    {"min": 10000, "max": '', "label": "10000>人", "color": "#C80000"},
                ]
            ),#根据颜色进行区分
            tooltip_opts=opts.TooltipOpts( is_show=True,  # 显示
                    trigger_on='mousemove|click',)  # 鼠标点击或者移动到出现具体的数值)

        )
        # .render('./html文件/各国数据(%s).html'%(datetime.date.today()))
    )

表格展示

 headers = df.columns.to_list()
    rows = list(df.values)
    # print(rows)
    table = (
        Table()
        .add(headers,rows)
        .set_global_opts(title_opts=opts.ComponentTitleOpts(title="Table"))
    )

是不是发现没有render生成html文件。其实我是故意。
pyecharts里面可以绘制进行组合图标绘制

page = Page(layout=Page.DraggablePageLayout)
    page.add(
        map,
        table,
    )
    page.render('./templates/各国数据(%s).html'%(datetime.date.today()))

在这里插入图片描述在这里插入图片描述
这就就连在了一起。

四:总结

pyecharts是个很好的可视化库pyecharts中文网站
也有demo

五:falsk展示

Flask是由python实现的一个web微框架,让我们可以使用Python语言快速实现一个网站或Web服务。

我们用的很简单,就是调用之前写的函数,然后渲染模板展示html在本地

# 世界地图和表格
@app.route('/')
def map_world():
    url = 'https://api.inews.qq.com/newsqa/v1/automation/foreign/country/ranklist'
    world_map(url)
    return render_template('各国数据(%s).html'%(datetime.date.today()))

@app.route('/index')
def index():
    return redirect(map_world)

#多国累计确诊趋势折线图
@app.route('/manycounrtry')
def manyCountry():
    main()
    return render_template('多国累计确诊趋势折线图.html')

wn = World_ncov()

##各大洲柱状图
@app.route('/world/statis')
def worldStatis():
    wn.continentStatis()
    return render_template('各大洲柱状图.html')


#今日新增 countryAddConfirmRankList 国家
@app.route('/counrtryadd')
def worldCountryAdd():
    wn.countryAddConfirmRankList()
    return render_template('今日国家新增数量.html')

#中国省份现有全确诊人数
@app.route('/china')
def chinaMap():
    wn.china_map()
    return render_template('中国省份现有全确诊人数.html')


"""
全球除了中国的
如果要实现总的确诊人数把  name = 'confirm'
全球每日死亡折线图name = 'dead'
全球每日治愈折线图name = 'heal'
全球每日治愈折线图name = 'newAddConfirm'

"""
#http://127.0.0.1:5000/world/info/heal/
#这种格式
@app.route('/world/info/<name>/')
def worldInfo(name):
    print(name)
    wn.globalDailyHistory(name=name)
    return render_template('全球历史%s信息.html'%name)

if __name__ == '__main__':
    app.run()

lima
差不多了,第一次那么写那么多。不写了。下次在写。过几天写一个python爬虫

源代码放在了百度网盘需要的可自行下载,里面一些函数命名,真头痛,不知你们是否遇到过,起名字的困难。哎

提取码:sj8y

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!