刷爆全网的动态条形图,原来5行Python代码就能实现!

说起动态图表,最火的莫过于动态条形图了。

在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目录下。

在虚拟环境下打开文件夹,命令行运行如下命令完成安装。

1cd 你的项目地址/venv/lib/python3.7/site-packages/bar_chart_race-master 2python setup.py install 3 4# 提示成功安装 5# Finished processing dependencies for bar-chart-race==0.2.0

好了,安装成功后就可以引入这个第三方库。

1import bar_chart_race as bcr 2 3# 如果出现SSL错误,则全局取消证书验证 4# import ssl 5# ssl._create_default_https_context = ssl._create_unverified_context 6 7# 获取数据 8df = bcr.load_dataset('covid19_tutorial') 9# print(df) 10 11# 生成GIF图像 12bcr.bar_chart_race(df, 'covid19_horiz.gif') 13

生成了一个GIF图,具体如下。

3行代码Python代码就实现了,对大佬封装好的库表示膜拜~

这里因为作者封装好了数据处理模块,只需要3行代码即可。

对于我们而言,是需要加载自己的数据,自己进行处理,所以多了那么2行。

示例里的数据直接使用作者提供的,在data文件夹下的covid19_tutorial.csv文件(GitHub上有)。

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

另外作者还提供了很多配置参数,供大家选择。

01 动态条形图变动态柱状图

1# orientation='v',生成柱状图 2bcr.bar_chart_race(df, 'covid19_horiz.gif', orientation='v')

02 排序方式,默认为降序(desc)

1# 设置排序方式,asc-升序 2bcr.bar_chart_race(df, 'covid19_horiz.gif', sort='asc') 3

03 条目数限制,此处设置为最多出现6条

1# 设置最多能显示的条目数,62bcr.bar_chart_race(df, 'covid19_horiz.gif', n_bars=6) 3

04 设置固定类目

1 2 3# 选取如下5个国家的数据 4bcr.bar_chart_race(df, 'covid19_horiz.gif', fixed_order=['Iran', 'USA', 'Italy', 'Spain', 'Belgium']) 5 6 7

05 固定数值轴,使其不发生动态变化

1 2 3# 设置数值的最大值,固定数值轴 4bcr.bar_chart_race(df, 'covid19_horiz.gif', fixed_max=True) 5 6 7

06 图像帧数,默认10帧,此处设置为3帧,可以发现图像明显变得有些卡顿

1 2 3# 图像帧数。数值越小,越不流畅。越大,越流畅。 4bcr.bar_chart_race(df, 'covid19_horiz.gif', steps_per_period=3) 5 6 7

07 设置帧率,单位时间默认为500ms

1 2 3# 设置20帧的总时间,此处为200ms 4bcr.bar_chart_race(df, 'covid19_horiz.gif', steps_per_period=20, period_length=200) 5 6

08 设置每帧增加的标签时间,默认为False

1 2 3# 输出MP4 4bcr.bar_chart_race(df, 'covid19_horiz.mp4', interpolate_period=True) 5 6

09 绘图属性设置

1# figsize-设置画布大小,默认(6, 3.5) 2# dpi-图像分辨率,默认144 3# label_bars-显示柱状图的数值信息,默认为True 4# period_label-显示时间标签信息,默认为True 5# title-图表标题 6bcr.bar_chart_race(df, 'covid19_horiz.gif', figsize=(5, 3), dpi=100, label_bars=False, 7 period_label={'x': .99, 'y': .1, 'ha': 'right', 'color': 'red'}, 8 title='COVID-19 Deaths by Country')

10 配置标签文字大小

1# bar_label_size-柱状图标签文字大小 2# tick_label_size-坐标轴标签文字大小 3# title_size-标题标签文字大小 4bcr.bar_chart_race(df, 'covid19_horiz.gif', bar_label_size=4, tick_label_size=5, 5 title='COVID-19 Deaths by Country', title_size='smaller') 6

11 全局文字属性

1# shared_fontdict-全局字体属性 2bcr.bar_chart_race(df, 'covid19_horiz.gif', title='COVID-19 Deaths by Country', 3 shared_fontdict={'family': 'Helvetica', 'weight': 'bold', 4 'color': 'rebeccapurple'}) 5

12 条形图属性,可以设置透明度,边框等

1# bar_kwargs-条形图属性 2bcr.bar_chart_race(df, 'covid19_horiz.gif', bar_kwargs={'alpha': .2, 'ec': 'black', 'lw': 3})

13 设置日期标签的时间格式

1 2# 设置日期格式,默认为'%Y-%m-%d' 3bcr.bar_chart_race(df, 'covid19_horiz.gif', period_fmt='%b %-d, %Y') 4

14 更改日期标签为数值

1# 设置日期标签为数值 2bcr.bar_chart_race(df.reset_index(drop=True), 'covid19_horiz.gif', interpolate_period=True, 3 period_fmt='Index value - {x:.2f}') 4

15 添加动态文本,此处为数值总数统计

1# 设置文本位置、数值、大小、颜色等 2def summary(values, ranks): 3 total_deaths = int(round(values.sum(), -2)) 4 s = f'Total Deaths - {total_deaths:,.0f}' 5 return {'x': .99, 'y': .05, 's': s, 'ha': 'right', 'size': 8} 6# 添加文本 7bcr.bar_chart_race(df, 'covid19_horiz.gif', period_summary_func=summary) 8

16 添加垂直条,可选类型有平均值、分位数等

1 2 3# 设置垂直条数值,分位数 4def func(values, ranks): 5 return values.quantile(.9) 6# 添加垂直条 7bcr.bar_chart_race(df, 'covid19_horiz.gif', perpendicular_bar_func=func) 8

17 设置柱状图颜色,默认为dark24

1 2 3# 设置柱状图颜色 4bcr.bar_chart_race(df, 'covid19_horiz.gif', cmap='accent') 5

18 柱状图颜色不重复,上面这个图是有重复颜色的

1 2 3# 去除重复颜色 4bcr.bar_chart_race(df, 'covid19_horiz.gif', cmap='accent', filter_column_colors=True)

这里有一些要注意的地方,比如中文配置,以及自定义颜色配置

中文配置只需在第三方库的「_make_chart.py」文件中,加入如下三行代码。

1#中文显示 2plt.rcParams['font.sans-serif'] = ['SimHei'] #Windows 3plt.rcParams['font.sans-serif'] = ['Hiragino Sans GB'] #Mac 4plt.rcParams['axes.unicode_minus'] = False

现在在图表中加入中文,来看看结果。

1 2import bar_chart_race as bcr 3import pandas as pd 4 5# 读取数据 6df = pd.read_csv('yuhuanshui.csv', encoding='utf-8', header=0, names=['name', 'number', 'day']) 7# 处理数据 8df_result = pd.pivot_table(df, values='number', index=['day'], columns=['name'], fill_value=0) 9# print(df_result) 10 11# 生成图像 12bcr.bar_chart_race(df_result, 'heat.gif', title='我是余欢水演职人员热度排行')

使用电视剧余欢水人物的「百度指数」数据。

文件具体内容如下。

经过数据透视表处理后,得到与该库格式相同的数据。

想用自己的数据来做动态条形图,5行代码****即可搞定

此外通过在「_colormaps.py」文件中添加颜色信息,经cmap引用,即可自定义配置颜色。

1colormaps = 2{ 3 "new_colors": [ 4 '#ff812c', 5 '#ff5a5a', 6 '#00c5d2', 7 '#a64dff', 8 '#4e70f0', 9 '#f95dba', 10 '#ffce2b' 11 ] 12} 13 14

使用一波,看会不会变得好看一些。

1 2# 使用自定义的颜色列表 3bcr.bar_chart_race(df_result, 'heat.gif', title='我是余欢水演职人员热度排行', cmap='new_colors')

果然,看起来还不错~

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

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

-------------------********************************** End **********-------------**-----********-**********************************

往期精彩文章推荐:

欢迎各位大佬点击链接加入群聊【helloworld开发者社区】:https://jq.qq.com/?_wv=1027&k=mBlk6nzX进群交流IT技术热点。

本文转自 https://mp.weixin.qq.com/s/756oiorPalfVT5Aox3Lr-g,如有侵权,请联系删

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )