直接先上一个作品知乎破万播放的动态条形图
说起动态图表,最火的莫过于动态条形图了。
在B站上搜索「动态条形图」这个关键词,可以看到很多与动态条形图相关的视频。
目前网上实现动态条形图现成的工具也很多。其他的操作起来比较麻烦。但是作为一名Pythoner,当然是想要研究一下如何用Python来实现。发现到了一个库「Bar Chart Race」,堪称Python界最强的动态可视化包。可做视频、可做图表。
GitHub地址:https://github.com/dexplo/bar_chart_race
文档地址:https://www.dexplo.org/bar_chart_race/
直接安装
pip install bar_chart_race
import bar_chart_race as bcr
# 如果出现SSL错误,则全局取消证书验证
# import ssl
# ssl._create_default_https_context = ssl._create_unverified_context
# 获取数据
# 示例里的数据直接使用作者提供的,在data文件夹下的covid19_tutorial.csv文件(GitHub上有)。
df = bcr.load_dataset('covid19_tutorial')
df
# 生成GIF图像
bcr.bar_chart_race(df, 'covid19_horiz.gif')
动态条形图变动态柱状图
# orientation='v',生成柱状图
bcr.bar_chart_race(df, 'covid19_horiz.gif', orientation='v')
排序方式,默认为降序(desc)
# 设置排序方式,asc-升序
bcr.bar_chart_race(df, 'covid19_horiz.gif', sort='asc')
条目数限制,此处设置为最多出现6条
# 设置最多能显示的条目数,6条
bcr.bar_chart_race(df, 'covid19_horiz.gif', n_bars=6)
设置固定类目
# 选取如下5个国家的数据
bcr.bar_chart_race(df, 'covid19_horiz.gif', fixed_order=['Iran', 'USA', 'Italy', 'Spain', 'Belgium'])
固定数值轴,使其不发生动态变化
# 设置数值的最大值,固定数值轴
bcr.bar_chart_race(df, 'covid19_horiz.gif', fixed_max=True)
图像帧数,默认10帧,此处设置为3帧
# 图像帧数。数值越小,越不流畅。越大,越流畅。
bcr.bar_chart_race(df, 'covid19_horiz.gif', steps_per_period=3)![请添加图片描述](https://img-blog.csdnimg.cn/8a4de073cbef4e309b5a415b7853c6fd.gif)
设置帧率,单位时间默认为500ms
# 设置20帧的总时间,此处为200ms
bcr.bar_chart_race(df, 'covid19_horiz.gif', steps_per_period=20, period_length=200)
设置每帧增加的标签时间,默认为False
# 输出MP4
bcr.bar_chart_race(df, 'covid19_horiz.mp4', interpolate_period=True)
# 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')
配置标签文字大小
# 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')
全局文字属性
# shared_fontdict-全局字体属性
bcr.bar_chart_race(df, 'covid19_horiz.gif', title='COVID-19 Deaths by Country',
shared_fontdict={
'family': 'Helvetica', 'weight': 'bold',
'color': 'rebeccapurple'})
条形图属性,可以设置透明度,边框等
# bar_kwargs-条形图属性
bcr.bar_chart_race(df, 'covid19_horiz.gif', bar_kwargs={
'alpha': .2, 'ec': 'black', 'lw': 3})
设置日期标签的时间格式
# 设置日期格式,默认为'%Y-%m-%d'
bcr.bar_chart_race(df, 'covid19_horiz.gif', period_fmt='%b %-d, %Y')
更改日期标签为数值
# 设置日期标签为数值
bcr.bar_chart_race(df.reset_index(drop=True), 'covid19_horiz.gif', interpolate_period=True,
period_fmt='Index value - {x:.2f}')
添加动态文本,此处为数值总数统计
# 设置文本位置、数值、大小、颜色等
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)
添加垂直条,可选类型有平均值、分位数等
# 设置垂直条数值,分位数
def func(values, ranks):
return values.quantile(.9)
# 添加垂直条
bcr.bar_chart_race(df, 'covid19_horiz.gif', perpendicular_bar_func=func)
设置柱状图颜色,默认为dark24
# 设置柱状图颜色
bcr.bar_chart_race(df, 'covid19_horiz.gif', cmap='accent')
柱状图颜色不重复,上面这个图是有重复颜色的
# 去除重复颜色
bcr.bar_chart_race(df, 'covid19_horiz.gif', cmap='accent', filter_column_colors=True)
中文配置,自定义颜色配置。
# 中文配置只需在第三方库的「_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