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

    科技2022-07-29  102

    公众号后台回复“图书“,了解更多号主新书内容

    作者:小F

    来源:法纳斯特

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

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

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

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

    比如数可视的「花火hanabi」,嫡数的「镝数图表」,以及国外网站「Flourish」。

    但是作为一名Pythoner,当然是想要研究一下如何用Python来实现。

    之前也看过大佬们通过Matplotlib、Plotly、Pyecharts实现类似的功能,就是代码量有点多,看的脑瓜疼。

    所以小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 添加动态文本,此处为数值总数统计

    # 设置文本位置、数值、大小、颜色等 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文件及相关安装包我已上传公众号,回复「条形图」即可获取。

    ◆ ◆ ◆  ◆ ◆ 麟哥新书已经在当当上架了,我写了本书:《拿下Offer-数据分析师求职面试指南》,目前当当正在举行活动,大家可以用相当于原价5折的预购价格购买,还是非常划算的: 点击下方小程序即可进入购买页面: 数据森麟公众号的交流群已经建立,许多小伙伴已经加入其中,感谢大家的支持。大家可以在群里交流关于数据分析&数据挖掘的相关内容,还没有加入的小伙伴可以扫描下方管理员二维码,进群前一定要关注公众号奥,关注后让管理员帮忙拉进群,期待大家的加入。 管理员二维码: 猜你喜欢 ● 麟哥拼了!!!亲自出镜推荐自己新书《数据分析师求职面试指南》● 厉害了!麟哥新书登顶京东销量排行榜!● 笑死人不偿命的知乎沙雕问题排行榜 ● 用Python扒出B站那些“惊为天人”的阿婆主!● 你相信逛B站也能学编程吗
    Processed: 0.009, SQL: 8