最近非常流行動態條形圖,在B站等影片網站上,此類影片經常會有上百萬的播放量,今天我們透過第三方庫:bar_chart_race (0.2 版本)來實現動態條形圖的生成;生成的效果如圖:問題:我發現按照目前流行的文章裡操作,會有很多的報錯,有一些我解決了,有一些我還沒有解決,現在把目前的進展記錄在這裡;
1. 安裝第三方包: bar_chart_race首先,我們要明白:只有 0.2版本才支援動態條形圖,所以我們必須保證我們安裝的第三方庫為 0.2版本;遺憾的是,我們透過pip install bar_chart_race 命令安裝的第三方包,版本是0.1,也無法升級;所以,這裡我們推薦在github上下載,然後安裝;安裝步驟如下:
首先要保證已經安裝了github 軟體,如果沒有,windows 請在這裡下載:https://git-scm.com/download/win, 點選自己的版本下載,然後安裝;其他系統也是一樣滴~~git安裝完畢後,在cmd中切換到想要下載的目錄,然後下載:git clone https://github.com/dexplo/bar_chart_race.git其中,https://github.com/dexplo/bar_chart_race.git 就是它的git地址;我這裡下載的目錄是:D:\PY_useful\3_python 基礎,下載完成後,會生成一個資料夾:bar_chart_race在cmd中進入該資料夾,然後執行:python setup.py install,安裝完成後,會提示:Finished processing dependencies for bar-chart-race==0.2.0 ,看到這個,就證明我們成功了!2. 資料準備資料需要滿足以下條件:
每一行必須是一個單獨日期的資料;每一列是一個單獨的分類;索引最好是日期資料(可選項);資料必須變化成 pandas.DataFrame 格式;官網 https://www.dexplo.org/bar_chart_race/, 官網的舉例如下:
dateBelgiumChinaFranceGermanyIranItalyNetherlandsSpainUSAUnited Kingdom2020-04-08224033371088723493993176692255147921470471112020-04-09252333391222826074110182792403154471655379932020-04-10301933401321527674232188492520160811859589742020-04-11334633431385128944357194682653166062047198922020-04-12360033431441230224474198992747172092203210629
但是,由於官網上的例子都是使用 df = bcr.load_dataset('covid19_tutorial') 載入的,而我們如果不翻牆的話,是無法載入這個資料的,我把供大家練習的資料放在這裡:點選下載練習資料;
3. 函式講解第三方模組bar_chart_race,只有兩個函式來生成我們的動態圖,
動態條形圖:bar_chart_race.bar_chart_race();下面詳細解釋一下這個函式中所有的引數:動態線形圖:bar_chart_race.line_chart_race();與上面的條形圖類似;import bar_chart_race as bcrimport pandasdf=pd.read_csv('資料.csv',index_col=0) # 下載資料後,放在.py檔案所在資料夾;# 以下有 # 註釋的引數,是我實際使用中發現並沒有的;可是官網資料上有這些引數,不知道為什麼~~bcr.bar_chart_race( df=df, # 第一個引數就是資料,這個資料格式必須是 pandas.DataFrame 格式,同時滿足資料準備中所說的條件; filename='bar_chart.mp4', # 這個引數是生成檔案的名字,一般為.mp4 & .gif; orientation='h', # 方向 sort='desc', # 排序 n_bars=6, # 限制條形圖數量 fixed_order=False, # 固定標籤 fixed_max=True, # 固定軸的最大值 steps_per_period=10, # 幀數設定 interpolate_period=False, # 插入時間 # label_bars=True, # 是否有label bar_size=.95, # 設定bar寬度 取值 0~1 之間; period_label={'x': .99, 'y': .25, 'ha': 'right', 'va': 'center'}, # period_fmt='%B %d, %Y', # 日期的格式設定 period_summary_func=lambda v, r: {'x': .99, 'y': .18, 's': r'Total weigth: {v.sum():,.0f}', 'ha': 'right', 'size': 8, 'family': 'Courier New'}, perpendicular_bar_func='median', period_length=500, # figsize=(5, 3), # dpi=144, # cmap='dark12', title='COVID-19 Deaths by Country', # title_size='', # bar_label_size=7, # tick_label_size=7, shared_fontdict={'family' : 'DejaVu Sans', 'color' : '.1'}, scale='linear', writer=None, fig=None, bar_kwargs={'alpha': .7}, filter_column_colors=False) 12345678910111213141516171819202122232425262728293031323334353637
4. 詳細舉例(複製即可用)4.1 基本條形圖import bar_chart_race as bcrimport pandas as pddf=pd.read_csv('資料.csv',index_col=0)bcr.bar_chart_race(df,filename='動態條形圖.mp4')12345
效果如圖:
4.2 柱狀圖使用 orientation 引數,轉換圖的方向;這裡 orientation 有兩個可賦予的值 h 和 v ;
import bar_chart_race as bcrimport pandas as pddf=pd.read_csv('資料.csv',index_col=0)bcr.bar_chart_race(df,'動態柱狀圖.mp4',orientation='v')12345
效果如圖:
4.3 排序圖預設情況下,是按照降序排列的,當我們需要升序排列時,使用引數:sort='asc'
import bar_chart_race as bcrimport pandas as pddf=pd.read_csv('資料.csv',index_col=0)bcr.bar_chart_race(df,'動態柱狀圖_升序.mp4',sort='asc')12345
效果如圖:
4.4 限制條形圖數量預設情況下,所有的列都會被顯示;如果我們需要控制數量,使用引數:n_bars=6,這裡數字6,可以改成任意整數;
import bar_chart_race as bcrimport pandas as pddf=pd.read_csv('資料.csv',index_col=0)bcr.bar_chart_race(df,'動態柱狀圖_5條形圖.mp4',n_bars=5)12345
效果如圖:
4.5 固定條形的順序預設情況下,條形圖會被按照降序排列,如果我們想固定順序,使用引數:fixed_order,將其改為True 或者 賦值一個列表;
import bar_chart_race as bcrimport pandas as pddf=pd.read_csv('資料.csv',index_col=0)bcr.bar_chart_race(df,'動態柱狀圖_條形固定.mp4',fixed_order=['Apple', 'banana', 'watermelon', 'orange'])12345
效果如圖:
4.6 固定軸的最大值預設情況下,數值軸的最大值根據時間變換,如果想要固定,使用引數:fixed_max=True。
import bar_chart_race as bcrimport pandas as pddf=pd.read_csv('資料.csv',index_col=0)bcr.bar_chart_race(df,'動態條形圖_固定軸的最大值.mp4',fixed_max=True)12345
效果如圖:
4.7 設定幀數預設情況下,幀數為10,我們可以將這個值改大,使影象更流暢;當然也可以改小;
import bar_chart_race as bcrimport pandas as pddf=pd.read_csv('資料.csv',index_col=0)bcr.bar_chart_race(df,'動態條形圖_設定幀數.mp4',steps_per_period=24)12345
效果如圖:
4.8 設定步長與停留時間import bar_chart_race as bcrimport pandas as pddf=pd.read_csv('資料.csv',index_col=0)bcr.bar_chart_race(df,'動態條形圖_設定步長與停留時間.mp4',steps_per_period=20, period_length=200)12345
效果如圖:
4.9 新增插入時間import bar_chart_race as bcrimport pandas as pddf=pd.read_csv('資料.csv',index_col=0)bcr.bar_chart_race(df,'動態條形圖_插入時間.mp4',interpolate_period=True)12345
4.10 設定字型屬性
import bar_chart_race as bcrimport pandas as pddf=pd.read_csv('資料.csv',index_col=0)bcr.bar_chart_race(df,filename='動態條形圖_設定字型屬性.mp4',shared_fontdict={'family': 'Helvetica', 'weight': 'bold','color': 'rebeccapurple'})12345
效果如圖:
4.11 定製條形屬性import bar_chart_race as bcrimport pandas as pddf=pd.read_csv('資料.csv',index_col=0)bcr.bar_chart_race(df,filename='動態條形圖_定製條形屬性.mp4',bar_kwargs={'alpha': .2, 'ec': 'black', 'lw': 3})12345
效果如圖:
4.12 增加文字說明這個,目前還沒有研究成功,稍後更新~
4.13 增加垂直bar平均值import bar_chart_race as bcrimport pandas as pddf=pd.read_csv('資料.csv',index_col=0)bcr.bar_chart_race(df,filename='動態條形圖_增加垂直bar平均值.mp4',perpendicular_bar_func='mean')12345
效果如圖:
4.14 自定義垂直bar——最大值import bar_chart_race as bcrimport pandas as pddf=pd.read_csv('資料.csv',index_col=0)# 自定義增加垂直bardef func(values, ranks): return values.max()bcr.bar_chart_race(df,filename='動態條形圖_增加垂直bar自定義最大值.mp4', perpendicular_bar_func=func)12345678
效果如圖:
4.15 條形圖顏色不重複import bar_chart_race as bcrimport pandas as pddf=pd.read_csv('資料.csv',index_col=0)bcr.bar_chart_race(df,filename='動態條形圖_條形圖顏色不重複.mp4',filter_column_colors=True)12345
效果如圖:
5. 遇到的問題5.1 [報錯] AttributeError: module ‘sip‘ has no attribute ‘setapi‘問題描述: 匯入 import bar_chart_race 報錯最近在匯入bar_chart_race 包時,遇到報錯:AttributeError: module ‘sip’ has no attribute ‘setapi’匯入的包:
import bar_chart_race as bcr1
只是執行匯入的語句,就會報錯:AttributeError: module ‘sip’ has no attribute ‘setapi’
解決辦法:最後發現這個報錯的原因是 matplotlib 庫的版本太高,我報錯的版本是 3.3.2,將其降級到 3.3.0 就沒有問題了;
先解除安裝:pip uninstall matplotlib
再安裝:pip install matplotlib==3.3.0
問題解決!!
5.2 [報錯] IndexError: list index out of range問題描述: 當輸出時.gif 格式時(如果是.mp4格式,不會報錯),執行時報錯:IndexError: list index out of range
解決辦法: 下載 :https://imagemagick.org/script/download.php 處的軟體,安裝即可,但是這個網址下載比較慢,也可以點選這裡下載(點選下載); 下載安裝,記得在安裝時要勾選這兩項;
安裝完成後,問題解決!!
5.3 [報錯] TypeError: bar_chart_race() got an unexpected keyword argument 'figsize'問題描述: 按照官網的例項進行配置時,發現有一些引數在實際的函式中是沒有的,列舉如下:
label_bars=True, # 是否有label period_fmt='%B %d, %Y', # 日期的格式設定 figsize=(5, 3), dpi=144, cmap='dark12', title_size='', bar_label_size=7, tick_label_size=7,12345678
上面列舉的這些引數,在函式中都不包含,我也不知道為什麼~ 因為有關這個第三方包的文章,大家都是翻譯的官網的例子,並沒有人實際求證,所以這個問題,如果大家有知道原因的~ 歡迎大家告訴我呀~ 感謝!!