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

Irene181 等级 1098 0 0

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

在B站上搜索「数据可视化」这个关键词,可以看到很多与动态条形图相关的视频。

好多视频都达到了上百万的播放量,属实厉害。

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

目前网上实现动态条形图现成的工具也很多。

比如数可视的「花火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版本,功能不太全。

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

通过pip install bar_chart_race也只能到0.1版本。

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

最后小F选择将项目从GitHub上下载下来**,再进行安装**。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

04 设置固定类目



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


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

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



# 设置数值的最大值,固定数值轴  
bcr.bar_chart_race(df, 'covid19_horiz.gif', fixed_max=True)  


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

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



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


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

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



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

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

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



# 输出MP4  
bcr.bar_chart_race(df, 'covid19_horiz.mp4', interpolate_period=True)

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

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')

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

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')

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

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'})

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

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

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

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

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


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

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

14 更改日期标签为数值

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

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

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)

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

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



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

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

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



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

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

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



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

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

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

中文配置只需在第三方库的「_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行Python代码就能实现!

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

文件具体内容如下。

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

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

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

想用自己的数据来做动态条形图,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')

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

果然,看起来还不错~

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

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

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

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

往期精彩文章推荐:

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

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

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

收藏
评论区

相关推荐

小伙子不讲武德,竟用Python爬取了B站上1.4w条马老师视频数据来分析
作者:朱小五 源自:凹凸数据 看到标题, 啪的一下你就进来了吧! 如果有经常刷B站的小伙伴,肯定都知道B站鬼畜现在的顶流是谁? 印度:没错正是在下 那必须
我用python帮朋友做了张图,结果
↖一个宝藏公众号,长的好看的人都关注了 却发现他是这么拿我当兄弟的 事情的经过是这样的: 我开开心心的去一家烧饼店吃饭 (ht
深入理解 Go Slice
(https://imghelloworld.osscnbeijing.aliyuncs.com/0ce8a8773a658d4b843e5796a0dbf001.png) image 原文地址:深入理解 Go Slice(https://github.com/EDDYCJY/blog/blob/master/golang/pkg/20
Android Service 流程分析
启动Service过程 Android Service启动时序图 (https://imghelloworld.osscnbeijing.aliyuncs.com/039313fdaaf1e7dea3bde222b3ec9934.png) Android Service启动时序图.png 上图就是Android
原来Python绘图也可以这么漂亮,这次真的是学习到了!
(https://imghelloworld.osscnbeijing.aliyuncs.com/8830803f033eeed85783e9058cf08968.png) 作者:朱小五 来源:快学Python 👆人生苦短,快学Python! 最近看了一篇文章《一个牛逼的Python 可视化库:PyG2Plot》,可惜只是简单介
被“词云”包围的冰冰会更好看吗?安排
(https://imghelloworld.osscnbeijing.aliyuncs.com/b299933deefc692934e8cc6141ab3894.png) 大家好,我是小五🐶 昨天「凹凸数据」发了一篇张同学投稿的文章《用Python爬取王冰冰vlog弹幕并制作词云(https://mp.weixin.qq.com/
用Python爬取王冰冰vlog弹幕并制作词云
(https://imghelloworld.osscnbeijing.aliyuncs.com/ee5c5cff038a2528350dc352e599b4c4.png) 大家好,我是张同学,最近的“瓜”,多到我们措手不及,可谓是“热点不断”。作为程序员,我们还可能随时为此而加班。 各种评论视频“爆炸”网络,打开首页全是热点话题的内容,某
python刷题-回文数
问题描述  1221是一个非常特殊的数,它从左边读和从右边读是一样的,编程求所有这样的四位十进制数。输出格式  按从小到大的顺序输出满足条件的四位十进制数。 for i in range(1000,10000): astr(i) if aa::1: print(a)直接输出即可 回文数for n in
python刷题-特殊的数字
问题描述  153是一个非常特殊的数,它等于它的每位数字的立方和,即153111555333。编程求所有满足这种条件的三位十进制数。输出格式  按从小到大的顺序输出满足条件的三位十进制数,每个数占一行。 for i in range(100,1000): a str(i)0 b str(i)1 c
python刷题-01字串
问题描述对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能。它们的前几个是:0000000001000100001100100请按从小到大的顺序输出这32种01串。 输出格式输出32行,按从小到大的顺序每行一个长度为5的01串。 样例输出00000000010001000011<以下部分省略 for i in range(0
python刷题-圆的面积
问题描述给定圆的半径r,求圆的面积。 输入格式输入包含一个整数r,表示圆的半径。 输出格式输出一行,包含一个实数,四舍五入保留小数点后7位,表示圆的面积。说明:在本题中,输入是一个整数,但是输出是一个实数。对于实数输出的问题,请一定看清楚实数输出的要求,比如本题中要求保留小数点后7位,则你的程序必须严格的输出7位小数,输出过多或者过少的小数位数都是不
python刷题-核桃的数量
问题描述小张是软件项目经理,他带领3个开发组。工期紧,今天都在加班呢。为鼓舞士气,小张打算给每个组发一袋核桃(据传言能补脑)。他的要求是:1. 各组的核桃数量必须相同2. 各组内必须能平分核桃(当然是不能打碎的)3. 尽量提供满足1,2条件的最小数量(节约闹革命嘛) 输入格式输入包含三个正整数a, b, c,表示每个组正在加班的人数,用空格分开(a,b
为啥要学Python?
为啥要学Python?如果我跟你说你现在用一天拉出来的财务统计表,学了Python之后能用1个小时就搞定,你学不学?如果你花了8个小时扒的竞品投放数据,学了Python之后能用30min搞定,你学不学?你总羡慕你的同事能6点下班,陪女朋友蹦迪夜生活丰富,你却在满脸油头的爆肝加班,学了Python之后,你也能这样,你学不学?如果我跟你说,学会了Python能增
小白学Python不知道从哪里入手?我教你python详细路线图
在这个信息爆炸的时代,以 “Python入门” 为关键字搜索出的结果成千上万。不少小白选手难免会东一榔头西一棒槌。这是一篇 Python 入门指南,针对那些没有任何编程经验,从零开始学习 Python 的同学。不管你学习的出发点是兴趣驱动、拓展思维,还是工作需要、想要转行,都可以此文作为一个参考。 非诚勿扰:正在学习python的小伙伴或者打算学习的,可以加
刷爆全网的动态条形图,原来5行Python代码就能实现!
说起动态图表,最火的莫过于动态条形图了。 在B站上搜索「数据可视化」这个关键词,可以看到很多与动态条形图相关的视频。 好多视频都达到了上百万的播放量,属实厉害。 目前网上实现动态条形图现成的工具也很多。 比如数可视的「花火hanabi」,嫡数的「镝数图表」,以及国外网站「Flourish」。 但是作为一名Pythoner,当然是想要研究一下如何