首頁 > 軟體

Python利用matplotlib實現製作動態條形圖

2022-10-10 14:01:01

大家好,本文將分享如何使用matplotlib製作動態條形圖,製作的圖很美,這個是我在之前釋出的一篇中使用的圖片,

效果如下

製作思路

為了方便大家學習,我將不直接進行講解,而是以我是如何一步步製作的思路來介紹整個過程。

說到用 Python 製作動態圖,首先想到的肯定是一些直接拿來就用的庫,雖然我沒做過,但是我相信一定有且不止一個,搜了一圈後發現有個bar chart race庫看起來不錯

畢竟有現成的輪子,只需要填充資料即可,但是研究了一番,正如我之前所說,越好看的圖對資料的要求越高,這個動態圖的庫指定資料必須類似如下格式

即有時間和國家兩個維度,通過時間的變化來動態變化資料,但是我的資料很簡單,就一列人名一列資料如下

如果再將資料強行修改成該庫所需要的格式,花費的功夫將更多!所以果斷放棄,回到我熟悉的matplotlib上,首先很自然的想法就是,根據每一行,寫一個迴圈,每次迴圈就建立一個條形圖。

這個想法是完全可以的,也有很多人這麼做了,但是有一個問題就是做出來的效果太難看了,並且每次迴圈都需要重新生成畫布繪圖需要一定時間,這也會讓最後的動態圖顯的不連貫。所以稍作嘗試後這個思路也被拋棄了。

animation

又經過一番探索後,終於找到一個合適的工具——animation模組,可以完美的實現我的需求,只需要將你的繪圖函數寫好,將涉及到的引數空出來,通過FuncAnimation來更新資料即可。

當然我也是第一次接觸,雖瞭解思路但不清楚具體實現邏輯,所以先從官方拉一個demo來看看整個過程如何實現

fig, ax = plt.subplots()
xdata, ydata = [], []
ln, = ax.plot([], [], 'r-', animated=False)

def init():
    ax.set_xlim(0, 2*np.pi)
    ax.set_ylim(-1, 1)
    return ln,

def update(frame):
    xdata.append(frame)
    ydata.append(np.sin(frame))
    ln.set_data(xdata, ydata)
    return ln,

ani = FuncAnimation(fig, update, frames=np.linspace(0, 2*np.pi, 128),
                    init_func=init, blit=True)

HTML(ani.to_jshtml())

上面這段程式碼取自官方檔案,並不難讀懂,首先建立figureaxes,之後將涉及到的資料xdata,ydata空出來,再用update函數來更新資料並繪圖,具體為將資料賦給frames,通過FuncAnimation範例傳到update中實現迭代繪圖,最後可以使用ipython的內建工具來將動態圖展示在notebook中,效果如下

到這裡基本上就搞明白整個過程了,下面我們只需要照貓畫虎,寫一個繪圖函數並設計如何更新資料即可,具體如下

解釋一下這一大段程式碼,拋開設定標題、座標軸等修飾的部分,實際上也只做了一件事通過flag引數來繪製每一行資料

為什麼需分為兩段,因為我們圖上需要七根柱子,而剛開始的時候只有不到七條資料,所以需要先建立七個空資料,在繪製前七個柱狀圖時,依次新增,而後面只需要從7開始,刪除最早的一個資料,並向後追加一個資料即可,額外需要考慮的是我們需要為每一個資料確定一個顏色,所以還有一列顏色列也需要更新,最終我們的資料如下

在搞定shuang這個繪圖函數後,只需要迭代更新資料並展示即可,相關程式碼如下

其中ani.save()可以將動圖儲存為gif,HTML(ani.to_html5_video())可以將動圖儲存為mp4,而HTML(ani.to_jshtml())則是在notebook中直接檢視最終效果(注意第一次執行這裡會報錯,根據相關提示安裝依賴即可),大家可以自己嘗試

至於程式碼中如何新增標題、修改座標軸、修改註釋等操作本文就不在細講了,最後是製作完成的效果,我個人感覺還不錯,也可以匯出為高解析度視訊新增bgm製作視訊

以上就是Python利用matplotlib實現製作動態條形圖的詳細內容,更多關於Python matplotlib動態條形圖的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com