首頁>技術>

最近非常流行動態條形圖,在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

上面列舉的這些引數,在函式中都不包含,我也不知道為什麼~ 因為有關這個第三方包的文章,大家都是翻譯的官網的例子,並沒有人實際求證,所以這個問題,如果大家有知道原因的~ 歡迎大家告訴我呀~ 感謝!!

11
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • IntelliJ IDEA2020-自定義配置以及資料遷移