火爆全網(wǎng)的動態(tài)條形圖,手把手教你使用5行Python代碼輕松實現(xiàn)!

說起動態(tài)圖表,最火的莫過于動態(tài)條形圖了。
在B站上搜索「數(shù)據(jù)可視化」這個關鍵詞,可以看到很多與動態(tài)條形圖相關的視頻。
好多視頻都達到了上百萬的播放量,屬實厲害。

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

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

最后選擇將項目從GitHub上下載下來,再進行安裝。

下載壓縮包,將解壓后的文件夾放置在項目的venv/lib/python3.7/site-packages目錄下。
在虛擬環(huán)境下打開文件夾,命令行運行如下命令完成安裝。
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
#?如果出現(xiàn)SSL錯誤,則全局取消證書驗證
#?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')
生成了一個GIF圖,具體如下。

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

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

另外作者還提供了很多配置參數(shù),供大家選擇。
01 動態(tài)條形圖變動態(tài)柱狀圖
#?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?條目數(shù)限制,此處設置為最多出現(xiàn)6條
#?設置最多能顯示的條目數(shù),6條
bcr.bar_chart_race(df,?'covid19_horiz.gif',?n_bars=6)

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

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

06 圖像幀數(shù),默認10幀,此處設置為3幀,可以發(fā)現(xiàn)圖像明顯變得有些卡頓
#?圖像幀數(shù)。數(shù)值越小,越不流暢。越大,越流暢。
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-顯示柱狀圖的數(shù)值信息,默認為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 更改日期標簽為數(shù)值
#?設置日期標簽為數(shù)值
bcr.bar_chart_race(df.reset_index(drop=True),?'covid19_horiz.gif',?interpolate_period=True,?
?????????????????????????????????period_fmt='Index?value?-?{x:.2f}')

15 添加動態(tài)文本,此處為數(shù)值總數(shù)統(tǒng)計
#?設置文本位置、數(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ù)
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
現(xiàn)在在圖表中加入中文,來看看結果。
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)過數(shù)據(jù)透視表處理后,得到與該庫格式相同的數(shù)據(jù)。

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

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

本文就到這里了,文中使用的CSV文件及相關安裝包我已上傳公眾號,回復「條形圖」即可獲取。
-END-
