Python實現(xiàn)動態(tài)條形圖繪制的示例代碼
兩年前在 B 站上看到了一個寶藏 up 主,名叫 "Jannchie見齊",專門做動態(tài)條形圖樣式的數據可視化。

做出的效果還是很不錯的,但工具使用的是 JS,不是 Python。于是嘗試搜索了一下,看看 Python 有沒有相關的庫,也能輕松做出動態(tài)條形圖的效果。幸運的是還真有相關的庫,叫 bar_chart_race,那么下面就來看看它的用法。
老規(guī)矩,使用之前先安裝,直接 pip install bar-chart-race 即可。
import?pandas?as?pd
import?bar_chart_race?as?bcr
#?如果出現(xiàn)SSL錯誤, 則全局取消證書驗證
"""
import?ssl
ssl._create_default_https_context?=?\
??ssl._create_unverified_context
"""??
#?獲取數據
df?=?pd.read_csv('covid19_tutorial.csv',?
?????????????????index_col=["date"])
#?生成?GIF?圖像
bcr.bar_chart_race(df,?"covid19_horiz.gif")我們看到代碼非常簡單,就是將數據轉成 pandas 的 DataFrame,然后調用 bar_chart_race 即可生成 GIF 圖像。

整體還是不錯的,然后重點來看一下數據:

其中表頭就是 GIF 圖表中 Y 軸的部分,但要注意的是,我們的圖表是隨時間不斷變化的,所以在生成 DataFrame 的時候必須將 date 字段設置為索引。然后數據隨著時間不斷變化,條形圖之間會根據數據的大小進行排序。
當然了,以上只是默認生成的,bar_chart_race 里面還有很多的參數,我們來看一下。
動態(tài)條形圖變動態(tài)柱狀圖
import?pandas?as?pd
import?bar_chart_race?as?bcr
df?=?pd.read_csv('covid19_tutorial.csv',?
?????????????????index_col=["date"])
bcr.bar_chart_race(df,?"covid19_horiz.gif",?
???????????????????orientation='v')
我們看到為了避免文字發(fā)生重疊,自動傾斜了,所以還是比較人性化的。
指定排序方式
排序方式默認為降序,也可以指定為升序。
import?pandas?as?pd
import?bar_chart_race?as?bcr
df?=?pd.read_csv('covid19_tutorial.csv',?
?????????????????index_col=["date"])
#?設置排序方式
bcr.bar_chart_race(df,?"covid19_horiz.gif",?
???????????????????sort='asc')
限制條目數
import?pandas?as?pd
import?bar_chart_race?as?bcr
df?=?pd.read_csv('covid19_tutorial.csv',?
?????????????????index_col=["date"])
#?設置最多能顯示的條目數,這里最多顯示?6?條
bcr.bar_chart_race(df,?'covid19_horiz.gif',?
???????????????????n_bars=6)
設置固定條目
import?pandas?as?pd
import?bar_chart_race?as?bcr
df?=?pd.read_csv('covid19_tutorial.csv',?
?????????????????index_col=["date"])
#?選取如下?5?個國家的數據
bcr.bar_chart_race(df,?'covid19_horiz.gif',?
???????????????????fixed_order=['Iran',?'USA',?'Italy',?
????????????????????????????????'Spain',?'Belgium'])
固定數值軸,使其不發(fā)生動態(tài)變化
import?pandas?as?pd
import?bar_chart_race?as?bcr
df?=?pd.read_csv('covid19_tutorial.csv',?
?????????????????index_col=["date"])
#?設置數值的最大值,固定數值軸
bcr.bar_chart_race(df,?'covid19_horiz.gif',?
???????????????????fixed_max=True)
設置圖像幀數,默認 10 幀
import?pandas?as?pd
import?bar_chart_race?as?bcr
df?=?pd.read_csv('covid19_tutorial.csv',?
?????????????????index_col=["date"])
#?圖像幀數:數值越小,越不流暢;越大,越流暢
bcr.bar_chart_race(df,?'covid19_horiz.gif',?
???????????????????steps_per_period=3)
可以看到,動圖變得不流暢了。
設置幀率,單位時間默認為 500ms
import?pandas?as?pd
import?bar_chart_race?as?bcr
df?=?pd.read_csv('covid19_tutorial.csv',?
?????????????????index_col=["date"])
#?設置幀率為?200ms,總共?20?幀
bcr.bar_chart_race(df,?'covid19_horiz.gif',?
???????????????????steps_per_period=20,?
???????????????????period_length=200)
設置每幀增加的標簽時間,默認為 False
import?pandas?as?pd
import?bar_chart_race?as?bcr
df?=?pd.read_csv('covid19_tutorial.csv',?
?????????????????index_col=["date"])
bcr.bar_chart_race(df,?'covid19_horiz.gif',?
???????????????????interpolate_period=True)

圖形樣式設置
import?pandas?as?pd
import?bar_chart_race?as?bcr
df?=?pd.read_csv('covid19_tutorial.csv',?index_col=["date"])
"""
figsize:?設置畫布大小,默認?(6,?3.5)
dpi:?圖像分辨率,默認?144
label_bars:?顯示柱狀圖的數值信息,默認為 True;
????????????指定為 False 則不顯示;指定為字典,則自定義顯示屬性
period_label:?顯示時間標簽信息,默認為 True;
??????????????指定為 False 則不顯示;指定為字典,則自定義顯示屬性
period_fmt:?設置日期格式
title:?圖表標題
title_size:?標題字體大小
shared_fontdict:?全局字體屬性,例如?
?????????????????{'family':?'Helvetica',?'weight':?'bold',?
??????????????????'color':?'rebeccapurple'}
"""
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')
條形圖屬性,可以設置透明度,邊框等
import?pandas?as?pd
import?bar_chart_race?as?bcr
df?=?pd.read_csv('covid19_tutorial.csv',?
?????????????????index_col=["date"])
# bar_kwargs:條形圖屬性
bcr.bar_chart_race(df,?'covid19_horiz.gif',?
???????????????????bar_kwargs={'alpha':?.2,?
???????????????????????????????'ec':?'black',?
???????????????????????????????'lw':?3})
添加動態(tài)文本
import?pandas?as?pd
import?bar_chart_race?as?bcr
import?matplotlib.pyplot?as?plt
#?設置字體,否則無法顯示中文
plt.rcParams['font.sans-serif']?=?['SimHei']??#?Windows
#?plt.rcParams['font.sans-serif']?=?['Hiragino?Sans?GB']?#?Mac
plt.rcParams['axes.unicode_minus']?=?False
df?=?pd.read_csv('covid19_tutorial.csv',?index_col=["date"])
def?summary(values,?ranks):
????#?動態(tài)文本的內容
????"""
????values?為?df?的每一行(Series),例如
????????Belgium????????????1143.0
????????China??????????????3326.0
????????France?????????????6520.0
????????Germany????????????1275.0
????????Iran???????????????3294.0
????????Italy?????????????14681.0
????????Netherlands????????1490.0
????????Spain?????????????11198.0
????????USA????????????????7418.0
????????United?Kingdom?????3611.0
????????Name:?2020-04-03,?dtype:?float64
????ranks?則是針對?values?的值進行了排名,例如
????????Belgium????????????1.0
????????China??????????????5.0
????????France?????????????7.0
????????Germany????????????2.0
????????Iran???????????????4.0
????????Italy?????????????10.0
????????Netherlands????????3.0
????????Spain??????????????9.0
????????USA????????????????8.0
????????United?Kingdom?????6.0
????????Name:?2020-04-03,?dtype:?float64
????"""
????all_people?=?int(values.sum())
????ranks_country?=?ranks.sort_values().index
????s?=?(f'總死亡人數:{all_people},'
?????????f'死亡人數最多的國家:{ranks_country[-1]},'
?????????f'死亡人數最少的國家:{ranks_country[0]}')
????#?設置文本位置、數值、大小、顏色等
????return?{'x':?.99,?'y':?.05,?'s':?s,
????????????'ha':?'right',?'size':?8}
#?添加文本
bcr.bar_chart_race(df,?'covid19_horiz.gif',
???????????????????period_summary_func=summary)
添加垂直條
import?pandas?as?pd
import?bar_chart_race?as?bcr
df?=?pd.read_csv('covid19_tutorial.csv',?
?????????????????index_col=["date"])
#?設置垂直條數值,分位數
def?func(values,?ranks):
????return?values.quantile(.9)
#?添加垂直條
bcr.bar_chart_race(df,?'covid19_horiz.gif',?
???????????????????perpendicular_bar_func=func)
設置柱狀圖顏色
import?pandas?as?pd
import?bar_chart_race?as?bcr
df?=?pd.read_csv('covid19_tutorial.csv',?
?????????????????index_col=["date"])
"""
#?具體有哪些顏色,可以通過如下方式查看
from?bar_chart_race._colormaps?import?colormaps
print(list(colormaps.keys()))
"""
bcr.bar_chart_race(df,?'covid19_horiz.gif',?
???????????????????cmap="plotly3")
以上就是絕大部分配置,當然源碼中注釋寫的也比較詳細,可以點進去看一下。
到此這篇關于Python實現(xiàn)動態(tài)條形圖繪制的示例代碼的文章就介紹到這了,更多相關Python動態(tài)條形圖內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

