城市设计/数据分析/技术分享/摄影记录

0%

新冠病毒疫情分析学习07-全国疫情动态变化可视化表达

本章将基于不同日期的各省市疫情数据,用pyecharts做动态可视化图表

首先准备好数据

1
2
3
4
5
6
7
8
9
10
11
# 读取数据
import pandas as pd
import warnings
warnings.filterwarnings('ignore')
# 设置不弹出警告
df = pd.read_excel('*/*/data_ncov.xlsx')

# 时间序列转换
df['date'] = df['date'].astype('str') # 先将字段转化为字符串
df['date'] = pd.to_datetime(df['date']) # 再进行时间序列转换
df.head()

重新构建函数提取数据

上一章,已经通过构建函数regiondata(where)用于提取数据,此章节新增一个参数time用来提取某日某地区的疫情数据,代码如下:

1
2
3
4
5
6
7
8
9
10
11
# 构建函数提取数据
def regiondata_time(where, time):
datai = df[df['省市'] == where]
# 分别计算新增数据
datai['疑似新增'] = datai['疑似'] - datai['疑似'].shift()
datai['确诊新增'] = datai['确诊'] - datai['确诊'].shift()
datai['死亡新增'] = datai['死亡'] - datai['死亡'].shift()
# 返回某日数据
return datai[datai['date'] == time]

regiondata_time('浙江省', '2020-2-1')

输出结果如下:

区域编码 省市 疑似 确诊 死亡 date 疑似新增 确诊新增 死亡新增
26 330000 浙江省 207 661 0 2020-02-01 5.0 62.0 0.0

绘制气泡图来描绘不同省市的疫情状况

首先线试试用3个省市来绘制气泡图,包括了3个维度的内容:

  • x轴 → 当日确诊病例新增
  • y轴 → 当日疑似病例新增
  • 点的大小 → 当日确证病例数量

注:当只有2个维度信息时是散点图(x和y),有3个维度信息时是气泡图(x、y、点的大小)

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 提取3个省市的数据
data_zj = regiondata_time('浙江省', '2020-2-1')
data_gd = regiondata_time('广东省', '2020-2-1')
data_hn = regiondata_time('湖南省', '2020-2-1')

# 绘制多气泡图(散点图)
import pyecharts as pe
scatter = pe.EffectScatter("2020-2-1 疫情情况", width = 1000)

# 添加浙江省数据
scatter.add("浙江省",[data_zj['确诊新增']], [data_zj['疑似新增']], symbol_size = data_zj['确诊'].iloc[0]/30)

# 添加其他数据及设置图表参数
scatter.add("广东省", [data_gd['确诊新增']], [data_gd['疑似新增']], symbol_size = data_gd['确诊'].iloc[0]/30)
scatter.add("湖南省", [data_hn['确诊新增']], [data_hn['疑似新增']], symbol_size = data_hn['确诊'].iloc[0]/30,
xaxis_name='确诊病例新增',xaxis_name_pos = 'end',
yaxis_name ='疑似病例新增',yaxis_name_gap=40,
is_toolbox_show = False,
tooltip_axispointer_type = 'cross',
legend_pos='20%')

scatter

结果如下:


知识点

pe.EffectScatter()的参数解释:

  • [data_zj['确诊新增']][data_zj['疑似新增']],这里分别设置了散点图的x和y,由于本关比较特殊,在后续做动态气泡图时需保留每个省市的图例颜色,需要单点添加图表,且这里需要设置可迭代对象(列表),所以会有一个[]来囊括内部数据data_zj['确诊新增']/data_zj['疑似新增']
  • symbol_size参数用来设置点的大小,这里为了让点不至于太大,所以用确诊病例数量除以了30
  • xaxis_name='确诊病例',设置x轴标签
  • xaxis_name_pos = 'end',设置x轴名称位置,有’start’,’middle’,’end’可选
  • yaxis_name ='疑似病例',设置y轴标签
  • yaxis_name_gap=40,设置y轴名称与轴线之间的距离
  • is_toolbox_show = False,设置是否显示工具栏,这里不用显示
  • legend_pos='20%',设置图例位置,有’left’, ‘center’, ‘right’可选,也可以为百分数,如”60%”

用for循环快速出图

梳理一下流程

  • 创建气泡图图表对象
  • 调用regiondata_time()提取某省市数据
  • 在气泡图中添加点

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 用for循环出气泡图
# 创建省市列表
regions = ['浙江省','广东省','湖南省','上海市','重庆市','四川省','河南省','江苏省']
scatter = pe.EffectScatter("2020-2-1 疫情情况", width = 1000)

# for循环
for i in regions:
# 提取数据
datai = regiondata_time(i, '2020-2-1')
# 设置参数
scatter.add(i,[datai['确诊新增']], [datai['疑似新增']], symbol_size = datai['确诊'].iloc[0]/30,
xaxis_name='确诊病例新增',xaxis_name_pos = 'end',
yaxis_name ='疑似病例新增',yaxis_name_gap=40,
is_toolbox_show = False,
tooltip_axispointer_type = 'cross',
legend_pos='20%')
scatter

输出结果为:


知识点
regions = ['浙江省',...],这里为了方便后续for循环做迭代,需要创建1个可迭代对象 —— 列表,用它来存储所需要绘制的省市


如何设置时间轴做动态气泡图

再多添加一个维度-时间维度,需要增加一个时间轴,操作需要分为两步:

  • 第一步:构建函数直接绘制单日疫情情况气泡图
    • 参数1:省市列表
    • 参数2:日期
  • 第二步:添加时间轴timeline,做动态气泡图表达
    • 创建时间轴timeline
    • 用for循环依次添加已创建的单日疫情情况气泡图

先构建第一步函数,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 构建函数直接绘制单日疫情情况气泡图
def fig3(regionlst, time):
# 创建气泡图对象
scatteri = pe.EffectScatter("%s 疫情情况" % time, width = 1000)
for i in regionlst:
# 提取数据
datai = regiondata_time(i, time)
# 设置参数
scatteri.add(i,[datai['确诊新增']], [datai['疑似新增']], symbol_size = datai['确诊'].iloc[0]/30,
xaxis_name='确诊病例新增',xaxis_name_pos = 'end',
yaxis_name ='疑似病例新增',yaxis_name_gap=40,
is_toolbox_show = False,
tooltip_axispointer_type = 'cross',
legend_pos='20%')
return scatteri

# 调用函数绘制单日疫情情况气泡图
regions = ['浙江省','广东省','湖南省','上海市','重庆市','四川省','河南省','江苏省']
fig3(regions, '2020-1-30')

输出结果如下:


知识点

  • pe.Timeline()的参数
    • is_auto_play=False,是否自动播放,默认为 Flase
    • timeline_play_interval=2000,播放的速度(跳动的间隔),单位毫秒(ms)
    • timeline_bottom='0%'timeline 组件离容器底侧的距离,值可以是像 20 这样的具体像素值,可以是像 ‘20%’ 这样相对于容器高宽的百分比,也可以是 ‘left’, ‘center’, ‘right’。如果 left 的值为’left’, ‘center’, ‘right’,组件会根据相应的位置自动对齐。
    • 更多的参数解释,可以参考timeline.py里的具体内容哦

本章内容如上,下一章将开始制作具有地理空间信息的图啦~敬请期待!

吃颗糖
  • 本文作者: Erek
  • 本文链接: https://erek.top/2020/007-xg/
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!