###############finish hot map
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')
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:
展示每天top10国家的数据
放在grid的左下角
"""
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()
"""
map图:
在整个grid中,map是被用来当作底图使用的
地图的颜色都在map中来配置
"""
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),
)
"""
GEO图:
geo在整个grid中是用于展示几个主要国家的数据
地图的样式都是由map控制
"""
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()