刷爆全网的动态条形图,原来5行Python代码就能实现!
说起动态图表,最火的莫过于动态条形图了。
在B站上搜索「数据可视化」这个关键词,可以看到很多与动态条形图相关的视频。
好多视频都达到了上百万的播放量,属实厉害。
![](https://filescdn.proginn.com/c0bf7b3cd08c2441e75031f51642ebc0/b0a1e392c2c248d12eb7ad9247bf4e9f.webp)
目前网上实现动态条形图现成的工具也很多。
比如数可视的「花火hanabi」,嫡数的「镝数图表」,以及国外网站「Flourish」。
但是作为一名Pythoner,当然是想要研究一下如何用Python来实现。
之前也看过大佬们通过Matplotlib、Plotly、Pyecharts实现类似的功能,就是代码量有点多,看的脑瓜疼。
所以最近发现到了一个库「Bar Chart Race」,堪称Python界最强的动态可视化包。
GitHub地址:
https://github.com/dexplo/bar_chart_race
文档地址:https://www.dexplo.org/bar_chart_race/
目前主要有0.1和0.2两个版本,0.2版本添加动态曲线图以及Plotly实现的动态条形图。
库是挺好的,就是在安装上有点问题。
在PyCharm的Project Interpreter上只能安装到0.1版本,功能不太全。
![](https://filescdn.proginn.com/57b435b3a2b644b667899e0fc9250514/dca31fcdaf5faae29acef9f294b03cd6.webp)
通过pip install bar_chart_race也只能到0.1版本。
![](https://filescdn.proginn.com/18fef2b72991f6a0ed2338ec2b1df0f6/56fa8b924b9f5e7c81508e6083ea1d9b.webp)
最后选择将项目从GitHub上下载下来,再进行安装。
![](https://filescdn.proginn.com/e0c17bf60f579b70aa66bdd51da07af0/f40759e80d959c6087db5782a029a5bf.webp)
下载压缩包,将解压后的文件夹放置在项目的venv/lib/python3.7/site-packages目录下。
在虚拟环境下打开文件夹,命令行运行如下命令完成安装。
cd 你的项目地址/venv/lib/python3.7/site-packages/bar_chart_race-master
python setup.py install
# 提示成功安装
# Finished processing dependencies for bar-chart-race==0.2.0
好了,安装成功后就可以引入这个第三方库。
import bar_chart_race as bcr
# 如果出现SSL错误,则全局取消证书验证
# import ssl
# ssl._create_default_https_context = ssl._create_unverified_context
# 获取数据
df = bcr.load_dataset('covid19_tutorial')
# print(df)
# 生成GIF图像
bcr.bar_chart_race(df, 'covid19_horiz.gif')
生成了一个GIF图,具体如下。
![](https://filescdn.proginn.com/4fc37edd070837ebcfe1c9b2e9380a7b/de2397e7bacd3e83f3e9136a74f0cecc.webp)
3行代码Python代码就实现了,对大佬封装好的库表示膜拜~
这里因为作者封装好了数据处理模块,只需要3行代码即可。
对于我们而言,是需要加载自己的数据,自己进行处理,所以多了那么2行。
示例里的数据直接使用作者提供的,在data文件夹下的covid19_tutorial.csv文件(GitHub上有)。
![](https://filescdn.proginn.com/8f2a83c088b37863e603c0f6a589cab0/f5bc222a44c4c64a241267cf74699112.webp)
经过其封装好的数据处理函数,得到最终的数据。
![](https://filescdn.proginn.com/f636ada667c20f4b595253f0282e7078/cb6b660a44c62b3a6cc1c197d0d9534d.webp)
另外作者还提供了很多配置参数,供大家选择。
01 动态条形图变动态柱状图
# orientation='v',生成柱状图
bcr.bar_chart_race(df, 'covid19_horiz.gif', orientation='v')
![](https://filescdn.proginn.com/4f58648e1df69dae494c44bbefa7de50/abb4d9ec83c4f6e6bf50ff8599bcf92a.webp)
02 排序方式,默认为降序(desc)
# 设置排序方式,asc-升序
bcr.bar_chart_race(df, 'covid19_horiz.gif', sort='asc')
![](https://filescdn.proginn.com/be0b7ffb094bc6f4ea408db5813f07f1/a2a58fb7930a3e9814d3c54385db1900.webp)
03 条目数限制,此处设置为最多出现6条
# 设置最多能显示的条目数,6条
bcr.bar_chart_race(df, 'covid19_horiz.gif', n_bars=6)
![](https://filescdn.proginn.com/26ce4c63044fd949c93297d4ffdc6ea0/8fc27f5e9b78e8548d6083d8c5da52a3.webp)
04 设置固定类目
# 选取如下5个国家的数据
bcr.bar_chart_race(df, 'covid19_horiz.gif', fixed_order=['Iran', 'USA', 'Italy', 'Spain', 'Belgium'])
![](https://filescdn.proginn.com/1c87d6d7fa0c9f0d44c085908cfd9cbb/0623c7f85e02f1b3642e0b50eed00130.webp)
05 固定数值轴,使其不发生动态变化
# 设置数值的最大值,固定数值轴
bcr.bar_chart_race(df, 'covid19_horiz.gif', fixed_max=True)
![](https://filescdn.proginn.com/a6a8ea004d3972faebbd86a7b8e9e1c4/cfb17ac156a114cd106f09f43c7c54b1.webp)
06 图像帧数,默认10帧,此处设置为3帧,可以发现图像明显变得有些卡顿
# 图像帧数。数值越小,越不流畅。越大,越流畅。
bcr.bar_chart_race(df, 'covid19_horiz.gif', steps_per_period=3)
07 设置帧率,单位时间默认为500ms
# 设置20帧的总时间,此处为200ms
bcr.bar_chart_race(df, 'covid19_horiz.gif', steps_per_period=20, period_length=200)
![](https://filescdn.proginn.com/fadee4742b3abbfa80b031b2f6196302/597102e82f202ab52a0468adb740ab4b.webp)
08 设置每帧增加的标签时间,默认为False
# 输出MP4
bcr.bar_chart_race(df, 'covid19_horiz.mp4', interpolate_period=True)
![](https://filescdn.proginn.com/73bf6d586110f659c32949d7ff24ab4a/88889f96c309516cc28e15d7479e2525.webp)
09 绘图属性设置
# figsize-设置画布大小,默认(6, 3.5)
# dpi-图像分辨率,默认144
# label_bars-显示柱状图的数值信息,默认为True
# period_label-显示时间标签信息,默认为True
# title-图表标题
bcr.bar_chart_race(df, 'covid19_horiz.gif', figsize=(5, 3), dpi=100, label_bars=False,
period_label={'x': .99, 'y': .1, 'ha': 'right', 'color': 'red'},
title='COVID-19 Deaths by Country')
![](https://filescdn.proginn.com/017454e63212ccc649538e940f496048/819755800a1f904565035ba5d40555b1.webp)
10 配置标签文字大小
# bar_label_size-柱状图标签文字大小
# tick_label_size-坐标轴标签文字大小
# title_size-标题标签文字大小
bcr.bar_chart_race(df, 'covid19_horiz.gif', bar_label_size=4, tick_label_size=5,
title='COVID-19 Deaths by Country', title_size='smaller')
![](https://filescdn.proginn.com/9b783da362258aa90ac361d6408ebcce/9e52ffc0940410b7b7995dc33bf82a9c.webp)
11 全局文字属性
# shared_fontdict-全局字体属性
bcr.bar_chart_race(df, 'covid19_horiz.gif', title='COVID-19 Deaths by Country',
shared_fontdict={'family': 'Helvetica', 'weight': 'bold',
'color': 'rebeccapurple'})
![](https://filescdn.proginn.com/dbf2e94d7d0b09d4dabe172d1859081a/5570ad1a7e8dbc4896b9125d7a1e7d38.webp)
12 条形图属性,可以设置透明度,边框等
# bar_kwargs-条形图属性
bcr.bar_chart_race(df, 'covid19_horiz.gif', bar_kwargs={'alpha': .2, 'ec': 'black', 'lw': 3})
![](https://filescdn.proginn.com/0598c3d7ba6ae24032ccbac2996e30f4/b6771a8b51a588b2506fbd6bf10d4da4.webp)
13 设置日期标签的时间格式
# 设置日期格式,默认为'%Y-%m-%d'
bcr.bar_chart_race(df, 'covid19_horiz.gif', period_fmt='%b %-d, %Y')
![](https://filescdn.proginn.com/21a25691e81e254dadd048a08a95f804/99b91008545fd30569ce246c60745bfd.webp)
14 更改日期标签为数值
# 设置日期标签为数值
bcr.bar_chart_race(df.reset_index(drop=True), 'covid19_horiz.gif', interpolate_period=True,
period_fmt='Index value - {x:.2f}')
![](https://filescdn.proginn.com/57e78d9385bbbdfac2e2c1c7037e3748/cfa5ef52be71e7b047f1d9975e9d8ba8.webp)
15 添加动态文本,此处为数值总数统计
# 设置文本位置、数值、大小、颜色等
def summary(values, ranks):
total_deaths = int(round(values.sum(), -2))
s = f'Total Deaths - {total_deaths:,.0f}'
return {'x': .99, 'y': .05, 's': s, 'ha': 'right', 'size': 8}
# 添加文本
bcr.bar_chart_race(df, 'covid19_horiz.gif', period_summary_func=summary)
![](https://filescdn.proginn.com/d7c66e613d3a18ecd7460b161d4f27f8/465a964fe07b5117d4ec239e1d1335d7.webp)
16 添加垂直条,可选类型有平均值、分位数等
# 设置垂直条数值,分位数
def func(values, ranks):
return values.quantile(.9)
# 添加垂直条
bcr.bar_chart_race(df, 'covid19_horiz.gif', perpendicular_bar_func=func)
![](https://filescdn.proginn.com/2a432655320e87ed45031db9e56fb4ca/4eee28fe48a88193c4bde2cd918bc119.webp)
17 设置柱状图颜色,默认为dark24
# 设置柱状图颜色
bcr.bar_chart_race(df, 'covid19_horiz.gif', cmap='accent')
![](https://filescdn.proginn.com/b031ff187c52e4b73cfd77f31acec383/cf613d8f1f4f1fef8c0a097e17d1f7a8.webp)
18 柱状图颜色不重复,上面这个图是有重复颜色的
# 去除重复颜色
bcr.bar_chart_race(df, 'covid19_horiz.gif', cmap='accent', filter_column_colors=True)
![](https://filescdn.proginn.com/e5ba5eaa488dc24bdaee859eab865bd1/faaa135a3e918a872a454a9523b4bbb8.webp)
这里有一些要注意的地方,比如中文配置,以及自定义颜色配置。
中文配置只需在第三方库的「_make_chart.py」文件中,加入如下三行代码。
#中文显示
plt.rcParams['font.sans-serif'] = ['SimHei'] #Windows
plt.rcParams['font.sans-serif'] = ['Hiragino Sans GB'] #Mac
plt.rcParams['axes.unicode_minus'] = False
现在在图表中加入中文,来看看结果。
import bar_chart_race as bcr
import pandas as pd
# 读取数据
df = pd.read_csv('yuhuanshui.csv', encoding='utf-8', header=0, names=['name', 'number', 'day'])
# 处理数据
df_result = pd.pivot_table(df, values='number', index=['day'], columns=['name'], fill_value=0)
# print(df_result)
# 生成图像
bcr.bar_chart_race(df_result, 'heat.gif', title='我是余欢水演职人员热度排行')
![](https://filescdn.proginn.com/c1651a5fc552cc9acf74565a7335e2c8/d459d8c4983989f895be5bce829011ad.webp)
使用电视剧余欢水人物的「百度指数」数据。
文件具体内容如下。
![](https://filescdn.proginn.com/9bff7f43c6b1b180658c4f9ddeb52dc2/fe5960cda77d758528fcef94db03a76e.webp)
经过数据透视表处理后,得到与该库格式相同的数据。
![](https://filescdn.proginn.com/b30feb30d0832f119d9eecb74a4641d8/aacfc3b57fe2e325bc6823cc4f242da0.webp)
想用自己的数据来做动态条形图,5行代码即可搞定。
此外通过在「_colormaps.py」文件中添加颜色信息,经cmap引用,即可自定义配置颜色。
colormaps =
{
"new_colors": [
'#ff812c',
'#ff5a5a',
'#00c5d2',
'#a64dff',
'#4e70f0',
'#f95dba',
'#ffce2b'
]
}
使用一波,看会不会变得好看一些。
# 使用自定义的颜色列表
bcr.bar_chart_race(df_result, 'heat.gif', title='我是余欢水演职人员热度排行', cmap='new_colors')
![](https://filescdn.proginn.com/c69db89912cdaded96b05a9f71eb6bb3/14a01a4314d4a79826a4bc1444dbcfbe.webp)
果然,看起来还不错~
还有一些细节上的参数,大家可通过查看库的源码,来了解一二。
![](https://filescdn.proginn.com/43967647fea3044138644dbce0752b36/d372b8839e5c32c02171f3b9e9f5f184.webp)
使用到的CSV文件及相关安装包我已上传公众号,回复「条形图」即可获取。
万水千山总是情,点个「好看」行不行。
恋习Python 关注恋习Python,Python都好练
好文章,我在看❤️