Python實(shí)現(xiàn)動態(tài)條形圖繪制的示例代碼
兩年前在 B 站上看到了一個(gè)寶藏 up 主,名叫 "Jannchie見齊",專門做動態(tài)條形圖樣式的數(shù)據(jù)可視化。
做出的效果還是很不錯(cuò)的,但工具使用的是 JS,不是 Python。于是嘗試搜索了一下,看看 Python 有沒有相關(guān)的庫,也能輕松做出動態(tài)條形圖的效果。幸運(yùn)的是還真有相關(guān)的庫,叫 bar_chart_race,那么下面就來看看它的用法。
老規(guī)矩,使用之前先安裝,直接 pip install bar-chart-race 即可。
import?pandas?as?pd import?bar_chart_race?as?bcr #?如果出現(xiàn)SSL錯(cuò)誤, 則全局取消證書驗(yàn)證 """ import?ssl ssl._create_default_https_context?=?\ ??ssl._create_unverified_context """?? #?獲取數(shù)據(jù) df?=?pd.read_csv('covid19_tutorial.csv',? ?????????????????index_col=["date"]) #?生成?GIF?圖像 bcr.bar_chart_race(df,?"covid19_horiz.gif")
我們看到代碼非常簡單,就是將數(shù)據(jù)轉(zhuǎn)成 pandas 的 DataFrame,然后調(diào)用 bar_chart_race 即可生成 GIF 圖像。
整體還是不錯(cuò)的,然后重點(diǎn)來看一下數(shù)據(jù):
其中表頭就是 GIF 圖表中 Y 軸的部分,但要注意的是,我們的圖表是隨時(shí)間不斷變化的,所以在生成 DataFrame 的時(shí)候必須將 date 字段設(shè)置為索引。然后數(shù)據(jù)隨著時(shí)間不斷變化,條形圖之間會根據(jù)數(shù)據(jù)的大小進(jìn)行排序。
當(dāng)然了,以上只是默認(rèn)生成的,bar_chart_race 里面還有很多的參數(shù),我們來看一下。
動態(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ā)生重疊,自動傾斜了,所以還是比較人性化的。
指定排序方式
排序方式默認(rèn)為降序,也可以指定為升序。
import?pandas?as?pd import?bar_chart_race?as?bcr df?=?pd.read_csv('covid19_tutorial.csv',? ?????????????????index_col=["date"]) #?設(shè)置排序方式 bcr.bar_chart_race(df,?"covid19_horiz.gif",? ???????????????????sort='asc')
限制條目數(shù)
import?pandas?as?pd import?bar_chart_race?as?bcr df?=?pd.read_csv('covid19_tutorial.csv',? ?????????????????index_col=["date"]) #?設(shè)置最多能顯示的條目數(shù),這里最多顯示?6?條 bcr.bar_chart_race(df,?'covid19_horiz.gif',? ???????????????????n_bars=6)
設(shè)置固定條目
import?pandas?as?pd import?bar_chart_race?as?bcr df?=?pd.read_csv('covid19_tutorial.csv',? ?????????????????index_col=["date"]) #?選取如下?5?個(gè)國家的數(shù)據(jù) bcr.bar_chart_race(df,?'covid19_horiz.gif',? ???????????????????fixed_order=['Iran',?'USA',?'Italy',? ????????????????????????????????'Spain',?'Belgium'])
固定數(shù)值軸,使其不發(fā)生動態(tài)變化
import?pandas?as?pd import?bar_chart_race?as?bcr df?=?pd.read_csv('covid19_tutorial.csv',? ?????????????????index_col=["date"]) #?設(shè)置數(shù)值的最大值,固定數(shù)值軸 bcr.bar_chart_race(df,?'covid19_horiz.gif',? ???????????????????fixed_max=True)
設(shè)置圖像幀數(shù),默認(rèn) 10 幀
import?pandas?as?pd import?bar_chart_race?as?bcr df?=?pd.read_csv('covid19_tutorial.csv',? ?????????????????index_col=["date"]) #?圖像幀數(shù):數(shù)值越小,越不流暢;越大,越流暢 bcr.bar_chart_race(df,?'covid19_horiz.gif',? ???????????????????steps_per_period=3)
可以看到,動圖變得不流暢了。
設(shè)置幀率,單位時(shí)間默認(rèn)為 500ms
import?pandas?as?pd import?bar_chart_race?as?bcr df?=?pd.read_csv('covid19_tutorial.csv',? ?????????????????index_col=["date"]) #?設(shè)置幀率為?200ms,總共?20?幀 bcr.bar_chart_race(df,?'covid19_horiz.gif',? ???????????????????steps_per_period=20,? ???????????????????period_length=200)
設(shè)置每幀增加的標(biāo)簽時(shí)間,默認(rèn)為 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)
圖形樣式設(shè)置
import?pandas?as?pd import?bar_chart_race?as?bcr df?=?pd.read_csv('covid19_tutorial.csv',?index_col=["date"]) """ figsize:?設(shè)置畫布大小,默認(rèn)?(6,?3.5) dpi:?圖像分辨率,默認(rèn)?144 label_bars:?顯示柱狀圖的數(shù)值信息,默認(rèn)為 True; ????????????指定為 False 則不顯示;指定為字典,則自定義顯示屬性 period_label:?顯示時(shí)間標(biāo)簽信息,默認(rèn)為 True; ??????????????指定為 False 則不顯示;指定為字典,則自定義顯示屬性 period_fmt:?設(shè)置日期格式 title:?圖表標(biāo)題 title_size:?標(biāo)題字體大小 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')
條形圖屬性,可以設(shè)置透明度,邊框等
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 #?設(shè)置字體,否則無法顯示中文 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)文本的內(nè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?的值進(jìn)行了排名,例如 ????????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'總死亡人數(shù):{all_people},' ?????????f'死亡人數(shù)最多的國家:{ranks_country[-1]},' ?????????f'死亡人數(shù)最少的國家:{ranks_country[0]}') ????#?設(shè)置文本位置、數(shù)值、大小、顏色等 ????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"]) #?設(shè)置垂直條數(shù)值,分位數(shù) def?func(values,?ranks): ????return?values.quantile(.9) #?添加垂直條 bcr.bar_chart_race(df,?'covid19_horiz.gif',? ???????????????????perpendicular_bar_func=func)
設(shè)置柱狀圖顏色
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")
以上就是絕大部分配置,當(dāng)然源碼中注釋寫的也比較詳細(xì),可以點(diǎn)進(jìn)去看一下。
到此這篇關(guān)于Python實(shí)現(xiàn)動態(tài)條形圖繪制的示例代碼的文章就介紹到這了,更多相關(guān)Python動態(tài)條形圖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)ssh批量登錄并執(zhí)行命令
本篇文章主要是介紹了Python實(shí)現(xiàn)ssh批量登錄并執(zhí)行命令,有一些任務(wù)可以進(jìn)行批量完成,Python就可以完成,有需要的同學(xué)可以了解一下。2016-10-10PyCharm運(yùn)行Python代碼時(shí)出現(xiàn)"未找到模塊"錯(cuò)誤解決步驟
在使用python的過程中經(jīng)常會遇到一個(gè)問題,就是叫什么名字的模塊未發(fā)現(xiàn),下面這篇文章主要給大家介紹了關(guān)于PyCharm運(yùn)行Python代碼時(shí)出現(xiàn)"未找到模塊"錯(cuò)誤的解決步驟,需要的朋友可以參考下2023-11-11anaconda jupyter不能導(dǎo)入安裝的lightgbm解決方案
這篇文章主要介紹了anaconda jupyter不能導(dǎo)入安裝的lightgbm解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03Keras Convolution1D與Convolution2D區(qū)別說明
這篇文章主要介紹了Keras Convolution1D與Convolution2D區(qū)別說明,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05Django框架HttpResponse和HttpRequest對象學(xué)習(xí)
這篇文章主要介紹了Django框架HttpResponse和HttpRequest對象學(xué)習(xí),有需要的朋友可以借鑒參考下,希望可以有所幫助,祝大家早日升職加薪2021-09-09python基于Tkinter實(shí)現(xiàn)人員管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了python基于Tkinter實(shí)現(xiàn)人員管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11Python 時(shí)間操作例子和時(shí)間格式化參數(shù)小結(jié)
這篇文章主要介紹了Python 時(shí)間操作例子,例如取前幾天、后幾天、前一月、后一月等,需要的朋友可以參考下2014-04-04Python numpy和matlab的幾點(diǎn)差異介紹
這篇文章主要介紹了Python numpy和matlab的幾點(diǎn)差異,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07