刷爆全網(wǎng)的動(dòng)態(tài)條形圖,原來(lái)5行Python代碼就能實(shí)現(xiàn)!
??本文轉(zhuǎn)載自公眾號(hào)【法納斯特】,詳情可以點(diǎn)擊上方卡片,關(guān)注該公眾號(hào),獲取更多好文推薦。
說(shuō)起動(dòng)態(tài)圖表,最火的莫過(guò)于動(dòng)態(tài)條形圖了。
在B站上搜索「數(shù)據(jù)可視化」這個(gè)關(guān)鍵詞,可以看到很多與動(dòng)態(tài)條形圖相關(guān)的視頻。
好多視頻都達(dá)到了上百萬(wàn)的播放量,屬實(shí)厲害。

目前網(wǎng)上實(shí)現(xiàn)動(dòng)態(tài)條形圖現(xiàn)成的工具也很多。
比如數(shù)可視的「花火hanabi」,嫡數(shù)的「鏑數(shù)圖表」,以及國(guó)外網(wǎng)站「Flourish」。
但是作為一名Pythoner,當(dāng)然是想要研究一下如何用Python來(lái)實(shí)現(xiàn)。
之前也看過(guò)大佬們通過(guò)Matplotlib、Plotly、Pyecharts實(shí)現(xiàn)類似的功能,就是代碼量有點(diǎn)多,看的腦瓜疼。
所以小F最近發(fā)現(xiàn)到了一個(gè)庫(kù)「Bar Chart Race」,堪稱Python界最強(qiáng)的動(dòng)態(tài)可視化包。
GitHub地址:
https://github.com/dexplo/bar_chart_race
文檔地址:https://www.dexplo.org/bar_chart_race/
目前主要有0.1和0.2兩個(gè)版本,0.2版本添加動(dòng)態(tài)曲線圖以及Plotly實(shí)現(xiàn)的動(dòng)態(tài)條形圖。
庫(kù)是挺好的,就是在安裝上有點(diǎn)問(wèn)題。
在PyCharm的Project Interpreter上只能安裝到0.1版本,功能不太全。

通過(guò)pip install bar_chart_race也只能到0.1版本。

最后小F選擇將項(xiàng)目從GitHub上下載下來(lái),再進(jìn)行安裝。

下載壓縮包,將解壓后的文件夾放置在項(xiàng)目的venv/lib/python3.7/site-packages目錄下。
在虛擬環(huán)境下打開(kāi)文件夾,命令行運(yùn)行如下命令完成安裝。
cd 你的項(xiàng)目地址/venv/lib/python3.7/site-packages/bar_chart_race-master
python setup.py install
# 提示成功安裝
# Finished processing dependencies for bar-chart-race==0.2.0
好了,安裝成功后就可以引入這個(gè)第三方庫(kù)。
import bar_chart_race as bcr
# 如果出現(xiàn)SSL錯(cuò)誤,則全局取消證書(shū)驗(yàn)證
# import ssl
# ssl._create_default_https_context = ssl._create_unverified_context
# 獲取數(shù)據(jù)
df = bcr.load_dataset('covid19_tutorial')
# print(df)
# 生成GIF圖像
bcr.bar_chart_race(df, 'covid19_horiz.gif')
生成了一個(gè)GIF圖,具體如下。

3行代碼Python代碼就實(shí)現(xiàn)了,對(duì)大佬封裝好的庫(kù)表示膜拜~
這里因?yàn)樽髡叻庋b好了數(shù)據(jù)處理模塊,只需要3行代碼即可。
對(duì)于我們而言,是需要加載自己的數(shù)據(jù),自己進(jìn)行處理,所以多了那么2行。
示例里的數(shù)據(jù)直接使用作者提供的,在data文件夾下的covid19_tutorial.csv文件(GitHub上有)。

經(jīng)過(guò)其封裝好的數(shù)據(jù)處理函數(shù),得到最終的數(shù)據(jù)。

另外作者還提供了很多配置參數(shù),供大家選擇。
01 動(dòng)態(tài)條形圖變動(dòng)態(tài)柱狀圖
# orientation='v',生成柱狀圖
bcr.bar_chart_race(df, 'covid19_horiz.gif', orientation='v')

02 排序方式,默認(rèn)為降序(desc)
# 設(shè)置排序方式,asc-升序
bcr.bar_chart_race(df, 'covid19_horiz.gif', sort='asc')

03 條目數(shù)限制,此處設(shè)置為最多出現(xiàn)6條
# 設(shè)置最多能顯示的條目數(shù),6條
bcr.bar_chart_race(df, 'covid19_horiz.gif', n_bars=6)

04 設(shè)置固定類目
# 選取如下5個(gè)國(guó)家的數(shù)據(jù)
bcr.bar_chart_race(df, 'covid19_horiz.gif', fixed_order=['Iran', 'USA', 'Italy', 'Spain', 'Belgium'])

05 固定數(shù)值軸,使其不發(fā)生動(dòng)態(tài)變化
# 設(shè)置數(shù)值的最大值,固定數(shù)值軸
bcr.bar_chart_race(df, 'covid19_horiz.gif', fixed_max=True)

06 圖像幀數(shù),默認(rèn)10幀,此處設(shè)置為3幀,可以發(fā)現(xiàn)圖像明顯變得有些卡頓
# 圖像幀數(shù)。數(shù)值越小,越不流暢。越大,越流暢。
bcr.bar_chart_race(df, 'covid19_horiz.gif', steps_per_period=3)

07 設(shè)置幀率,單位時(shí)間默認(rèn)為500ms
# 設(shè)置20幀的總時(shí)間,此處為200ms
bcr.bar_chart_race(df, 'covid19_horiz.gif', steps_per_period=20, period_length=200)

08 設(shè)置每幀增加的標(biāo)簽時(shí)間,默認(rèn)為False
# 輸出MP4
bcr.bar_chart_race(df, 'covid19_horiz.mp4', interpolate_period=True)

09 繪圖屬性設(shè)置
# figsize-設(shè)置畫(huà)布大小,默認(rèn)(6, 3.5)
# dpi-圖像分辨率,默認(rèn)144
# label_bars-顯示柱狀圖的數(shù)值信息,默認(rèn)為T(mén)rue
# period_label-顯示時(shí)間標(biāo)簽信息,默認(rèn)為T(mén)rue
# title-圖表標(biāo)題
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 配置標(biāo)簽文字大小
# bar_label_size-柱狀圖標(biāo)簽文字大小
# tick_label_size-坐標(biāo)軸標(biāo)簽文字大小
# title_size-標(biāo)題標(biāo)簽文字大小
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 條形圖屬性,可以設(shè)置透明度,邊框等
# bar_kwargs-條形圖屬性
bcr.bar_chart_race(df, 'covid19_horiz.gif', bar_kwargs={'alpha': .2, 'ec': 'black', 'lw': 3})

13 設(shè)置日期標(biāo)簽的時(shí)間格式
# 設(shè)置日期格式,默認(rèn)為'%Y-%m-%d'
bcr.bar_chart_race(df, 'covid19_horiz.gif', period_fmt='%b %-d, %Y')

14 更改日期標(biāo)簽為數(shù)值
# 設(shè)置日期標(biāo)簽為數(shù)值
bcr.bar_chart_race(df.reset_index(drop=True), 'covid19_horiz.gif', interpolate_period=True,
period_fmt='Index value - {x:.2f}')

15 添加動(dòng)態(tài)文本,此處為數(shù)值總數(shù)統(tǒng)計(jì)
# 設(shè)置文本位置、數(shù)值、大小、顏色等
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 添加垂直條,可選類型有平均值、分位數(shù)等
# 設(shè)置垂直條數(shù)值,分位數(shù)
def func(values, ranks):
return values.quantile(.9)
# 添加垂直條
bcr.bar_chart_race(df, 'covid19_horiz.gif', perpendicular_bar_func=func)

17 設(shè)置柱狀圖顏色,默認(rèn)為dark24
# 設(shè)置柱狀圖顏色
bcr.bar_chart_race(df, 'covid19_horiz.gif', cmap='accent')

18 柱狀圖顏色不重復(fù),上面這個(gè)圖是有重復(fù)顏色的
# 去除重復(fù)顏色
bcr.bar_chart_race(df, 'covid19_horiz.gif', cmap='accent', filter_column_colors=True)

這里有一些要注意的地方,比如中文配置,以及自定義顏色配置。
中文配置只需在第三方庫(kù)的「_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
現(xiàn)在在圖表中加入中文,來(lái)看看結(jié)果。
import bar_chart_race as bcr
import pandas as pd
# 讀取數(shù)據(jù)
df = pd.read_csv('yuhuanshui.csv', encoding='utf-8', header=0, names=['name', 'number', 'day'])
# 處理數(shù)據(jù)
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='我是余歡水演職人員熱度排行')

使用電視劇余歡水人物的「百度指數(shù)」數(shù)據(jù)。
文件具體內(nèi)容如下。

經(jīng)過(guò)數(shù)據(jù)透視表處理后,得到與該庫(kù)格式相同的數(shù)據(jù)。

想用自己的數(shù)據(jù)來(lái)做動(dòng)態(tài)條形圖,5行代碼即可搞定。
此外通過(guò)在「_colormaps.py」文件中添加顏色信息,經(jīng)cmap引用,即可自定義配置顏色。
colormaps =
{
"new_colors": [
'#ff812c',
'#ff5a5a',
'#00c5d2',
'#a64dff',
'#4e70f0',
'#f95dba',
'#ffce2b'
]
}
使用一波,看會(huì)不會(huì)變得好看一些。
# 使用自定義的顏色列表
bcr.bar_chart_race(df_result, 'heat.gif', title='我是余歡水演職人員熱度排行', cmap='new_colors')

果然,看起來(lái)還不錯(cuò)~
還有一些細(xì)節(jié)上的參數(shù),大家可通過(guò)查看庫(kù)的源碼,來(lái)了解一二。

