(给Python开发者加星标,提升Python技能
来源:法纳斯特-小F  (本文来自作者投稿)
说起动态图表,最火的莫过于动态条形图了。
在B站上搜索「数据可视化」这个关键词,可以看到很多与动态条形图相关的视频。
好多视频都达到了上百万的播放量,属实厉害。
目前网上实现动态条形图现成的工具也很多。
比如数可视的「花火hanabi」,嫡数的「镝数图表」,以及国外网站「Flourish」。
但是作为一名Pythoner,当然是想要研究一下如何用Python来实现。
之前也看过大佬们通过MatplotlibPlotlyPyecharts实现类似的功能,就是代码量有点多,看的脑瓜疼。
所以小F最近发现到了一个库「
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版本,功能不太全。
通过pip install bar_chart_race也只能到0.1版本。
最后小F选择
将项目从GitHub上下载下来,再进行安装


下载压缩包,将解压后的文件夹放置在项目的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图,具体如下。

3行代码Python代码就实现了,对大佬封装好的库表示膜拜~
这里因为作者封装好了数据处理模块,只需要3行代码即可。
对于我们而言,是需要加载自己的数据,自己进行处理,所以多了那么2行。
示例里的数据直接使用作者提供的,在data文件夹下的covid19_tutorial.csv文件(GitHub上有)。

经过其封装好的数据处理函数,得到最终的数据。


另外作者还提供了很多配置参数,供大家选择。
01 动态条形图变动态柱状图
# orientation='v',生成柱状图
bcr.bar_chart_race(df, 'covid19_horiz.gif', orientation='v')
02 排序方式,默认为降序(desc)
# 设置排序方式,asc-升序
bcr.bar_chart_race(df, 'covid19_horiz.gif', sort='asc')
03 条目数限制,此处设置为最多出现6条
# 设置最多能显示的条目数,6条
bcr.bar_chart_race(df, 
'covid19_horiz.gif'
, n_bars=
6
)

04 设置固定类目
# 选取如下5个国家的数据
bcr.bar_chart_race(df, 
'covid19_horiz.gif'
, fixed_order=[
'Iran'
'USA'
'Italy'
'Spain'
'Belgium'
])

05 固定数值轴,使其不发生动态变化
# 设置数值的最大值,固定数值轴
bcr.bar_chart_race(df, 
'covid19_horiz.gif'
, fixed_max=
True
)

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)
08 设置每帧增加的标签时间,默认为False
# 输出MP4
bcr.bar_chart_race(df, 'covid19_horiz.mp4', interpolate_period=True)
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'
)
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'
)
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'
})

12 条形图属性,可以设置透明度,边框等
# bar_kwargs-条形图属性
bcr.bar_chart_race(df, 
'covid19_horiz.gif'
, bar_kwargs={
'alpha'
.2
'ec'
'black'
'lw'
3
})

13 设置日期标签的时间格式
# 设置日期格式,默认为'%Y-%m-%d'
bcr.bar_chart_race(df, 
'covid19_horiz.gif'
, period_fmt=
'%b %-d, %Y'
)

14 更改日期标签为数值
# 设置日期标签为数值
bcr.bar_chart_race(df.reset_index(drop=
True
), 
'covid19_horiz.gif'
, interpolate_period=
True

                                 period_fmt=
'Index value - {x:.2f}'
)

15 添加动态文本,此处为数值总数统计
# 设置文本位置、数值、大小、颜色等
defsummary(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)

16 添加垂直条,可选类型有平均值、分位数等
# 设置垂直条数值,分位数
deffunc(values, ranks):
return
 values.quantile(
.9
)

# 添加垂直条
bcr.bar_chart_race(df, 
'covid19_horiz.gif'
, perpendicular_bar_func=func)

17 设置柱状图颜色,默认为dark24
# 设置柱状图颜色
bcr.bar_chart_race(df, 'covid19_horiz.gif', cmap='accent')
18 柱状图颜色不重复,上面这个图是有重复颜色的
# 去除重复颜色
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
现在在图表中加入中文,来看看结果。
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=
'我是余欢水演职人员热度排行'
)
使用电视剧余欢水人物的「
百度指数
」数据。

文件具体内容如下。

经过数据透视表处理后,得到与该库格式相同的数据。
想用自己的数据来做动态条形图,
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'
)

果然,看起来还不错~

还有一些细节上的参数,大家可通过查看库的源码,来了解一二。


使用到的CSV文件及相关安装包我已上传公众号,回复「条形图」即可获取。

- EOF -
觉得本文对你有帮助?请分享给更多人
关注「Python开发者」加星标,提升Python技能
点赞和在看就是最大的支持❤️
继续阅读
阅读原文