社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

Python编程时光 • 4 年前 • 570 次点击  
点击上方“Python编程时光”,选择“加为星标
第一时间关注Python技术干货!

明哥原创的200页《PyCharm 中文指南》 震撼发布



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


在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=(53), 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 添加动态文本,此处为数值总数统计


# 设置文本位置、数值、大小、颜色等
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)


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


# 设置垂直条数值,分位数
def func(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文件及相关安装包我已上传公众号,回复「条形图」即可获取。



文末福利

明哥整理了 21 张 Python 代码速查表,每一张都是国外的大师总结的,非常实用 ~

怎么获取呢?


添加明哥微信,备注 "速查表" 获取




推荐阅读


明哥写的 200页《PyCharm 中文指南》 终于发布了

《Python黑魔法指南》全新版本 v2.0 上线发布

太牛逼了!一款软件几乎可以操作所有的数据库!

生产力终极指南:用了两年,如今才算真正会用VS Code

提速72倍,在Python里面调用Golang函数

用 VS Code 写 Python,这8个扩展装上后无敌了

这一行代码,能让你的 Python运行速度提高100倍

Python 之父为什么嫌弃 lambda 匿名函数?



长按下图  ➡   关注博主

(按左边关注 Python, 按右边关注 Goalng


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/74111
 
570 次点击