看到同事用tableau做了条形竞赛图,想用python实现一下
什么是条形图竞赛?
条形图竞赛是一系列动画的条形图,显示了不同时间点的数据值。条形图在每个时间段都会重新定位,以便它们保持顺序(升序或降序)。
1.数据预处理
用pandas预处理数据,将数据处理成以下样子
数据预处理需要注意以下三点:
1.每行代表一个时间段
2.每列均包含特定类别的值
3.索引包含时间部分
2.时间段之间的过渡条平滑
在做过渡之前,可以抽一天的数据看一下展示效果
注意中文乱码处理
在动画中将每一天用作单个帧将无法很好地工作,因为它无法捕获从一个时间段到下一个时间段的过渡。为了过渡更改位置的柱形图,我们需要在我们拥有的日期之间添加额外的数据行。
1.重置索引列
data_res1 = data_res1.reset_index()
2.将索引列按一定步长扩充
data_res1.index = data_res1.index * 5
3.排序一下索引列
last_idx = data_res1.index[-1] + 1
df_expanded = data_res1.reindex(range(last_idx))
结果如下:
4.将时间再次设置为索引
df_expanded['c_day'] = df_expanded['c_day'].fillna(method='ffill')
df_expanded = df_expanded.set_index('c_day')
5.增加一个rank dataframe来用作y轴排序
df_rank_expanded = df_expanded.rank(axis=1, method='first')
6.分别为两个df填充空值
df_expanded = df_expanded.interpolate()
df_rank_expanded = df_rank_expanded.interpolate()
7.绘制第一天到第二天的每个步骤
3.绘制动画
用html展示或者保存为gif或者视频:
from IPython.display import HTML
html = anim.to_html5_video()
HTML(html)
完整代码:https://github.com/zxqshahn/something_instereing/blob/master/bar_chart_race.py