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