疫情数据热力图

from pyecharts.charts import *
from pyecharts import options as opts
from pyecharts.commons.utils import JsCode
from pyecharts.datasets import register_url
import pandas as pd
import numpy as np


df_state = pd.read_csv('/home/hadoop/us-state.csv')

import requests

# 下载美国地图
data = requests.get(url="https://echarts.apache.org/examples/data/asset/geo/USA.json").json()

area_move = """{
        Alaska: {              // 把阿拉斯加移到美国主大陆左下方
            left: -128,
            top: 25,
            width: 15
        },
        Hawaii: {
            left: -110,        // 夏威夷
            top: 25,
            width: 5
        },
        'Puerto Rico': {       // 波多黎各
            left: -76,
            top: 26,
            width: 2
        }
    }"""
state_list = [ 'New York','New Jersey',
    'Massachusetts',
    'Illinois',
    'California',
    'Pennsylvania',
    'Michigan',
    'Florida',
    'Texas',
    'Louisiana']
loc = {
    'New York': [-77.875175, 42.850458],
    'New Jersey':[-74.236547,41.14083],
    'Massachusetts': [-70.917521,42.887974],
    'Illinois': [-90.5213, 39.8425],
    'California': [-125.24302, 40.059232],
    'Pennsylvania':[-79.76278,42.252649],
    'Michigan':[-83.454238,41.732339],
    'Florida':[-85.497137,30.997536],
    'Texas': [-101.102854, 31.916611],
    'Louisiana':[-93.608485,33.018527]
}


tl = Timeline(init_opts=opts.InitOpts(theme='chalk', width='1000px', height='600px'))

# 时间轴配置
tl.add_schema(
    is_auto_play=True,  # 自动播放
    is_timeline_show=False,   # 关闭timeline组件
    is_loop_play=True,  # 是否循环播放
    play_interval=200   # 播放速度,200ms
    )
    
for day in df_state.date.unique().tolist()[::5]:
    
    # 用于geo和bar中的标签显示
    fmt_js = """function (params) {return params.name+':'+Number(params.value[2]);}"""
    

    data_new = df_state[df_state.date == day]

    data_dict = {}
    for _, row in data_new.iterrows():
        if(row.state in data_dict.keys()):
            data_dict[row.state]+= row.cases
        else:
            data_dict[row.state]= row.cases
    keylist=list(data_dict.keys())
    valuelist=list(data_dict.values())

    data_pair=[]
    for i in range(len(data_dict)):
        data_pair.append([keylist[i],valuelist[i]])
    t = sorted(data_pair, key=lambda x: x[1], reverse=True)[:10][::-1]
    
    
    bar = Bar()
    bar.add_xaxis([x for x, y in t])
    bar.add_yaxis("", [y for x, y in t],
                  itemstyle_opts={'normal': {'borderColor': '#1773c3',
                                             'shadowColor': '#1773c3',
                                             'shadowBlur': 20,
                                             'opacity': 0.8
                                             }
                                  })
    # 标签格式设置
    bar.set_series_opts(label_opts=opts.LabelOpts(position="insideLeft",
                                                  font_size=10,
                                                  font_weight='bold',
                                                  formatter='{b}:{c}'))
    # 全局配置项
    bar.set_global_opts(xaxis_opts=opts.AxisOpts(is_show=False, max_=7e6),
                        yaxis_opts=opts.AxisOpts(is_show=False),
                        title_opts=opts.TitleOpts(title="TOP 10 {}".format(day), pos_top='55%', pos_left='5%',
                                                  title_textstyle_opts=opts.TextStyleOpts(font_size=12)),
                        visualmap_opts=opts.VisualMapOpts(is_show=False,
                                                          max_=5e5,
                                                          is_piecewise=False,
                                                          dimension=0,
                                                          range_color=['rgba(219,112,147,0.4)', 'rgba(238,25,27,1)']))
    # 转换xy轴
    bar.reversal_axis()

    mp = Map()
    mp.add_js_funcs("""echarts.registerMap('USA', {}, {});""".format(data, area_move))
    mp.add(
        "累计确诊人数",
        data_pair,
        "USA",
        is_map_symbol_show=False,
        is_roam=False)
    # 关闭map的标签显示 & 地图风格设置
    mp.set_series_opts(label_opts=opts.LabelOpts(is_show=False),
                       itemstyle_opts={'normal': {
                           'areaColor': '#091632',
                           'borderColor': '#1773c3',
                           'shadowColor': '#1773c3',
                           'shadowBlur': 20,
                           'opacity': 0.6
                       }
    })
    
    mp.set_global_opts(
        title_opts=opts.TitleOpts(title="美国疫情蔓延趋势", 
                                  subtitle='数据更新日期:{}'.format(df_state.date.max()),
                                  pos_top='2%', pos_left='center',
                                  title_textstyle_opts=opts.TextStyleOpts(font_size=18)),
        legend_opts=opts.LegendOpts(is_show=False),
    )


    data_pair = [[x, y] for x, y in data_pair if x in state_list]
    geo = Geo()
    geo.add_js_funcs("""echarts.registerMap('USA', {}, {});""".format(data, area_move))
    # 需要先将几个国家的经纬度信息加入到geo中
    for k, v in loc.items():
        geo.add_coordinate(k, v[0], v[1])
    # 这里将geo的地图透明度配置为0
    geo.add_schema(
        maptype="USA",
        is_roam=False,
        itemstyle_opts={
            'normal': {
                'opacity': 0}})
    
    geo.add("", data_pair, symbol_size=1)
    # 显示标签配置
    geo.set_series_opts(
        label_opts=opts.LabelOpts(
            is_show=True,
            position='right',
            color='white',
            font_size=12,
            font_weight='bold',
            formatter=JsCode(fmt_js)),
    )
    
    # 将三个图组合起来,配置好各自的位置
    grid = (
        Grid(init_opts=opts.InitOpts(theme='chalk', width='1000px', height='600px'))
        .add(bar, grid_opts=opts.GridOpts(pos_top="60%", pos_right='70%', pos_left='5%'))
        .add(mp, grid_opts=opts.GridOpts(pos_top="12%"))
        .add(geo, grid_opts=opts.GridOpts(pos_bottom="12%"))
    )
    
    grid.render_notebook()
    
    tl.add(grid, day)

tl.render_notebook()

参考博客:工作台 - Heywhale.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值