基於Python的圖表繪圖系統matplotlib,「動態條形圖」你了解嗎?

2021-01-15 CDA數據分析師

動態條形圖大火了一陣子,尤其是那種對比世界各國曆年來的GDP或者軍事實力的動態條形圖,配上激動人心的音樂,眼看著中國從後往前排名不斷考前,作為愛國的人,集體榮譽感爆棚的那種,真的是心潮澎湃自豪到仿佛國力的提升我也做出了不可磨滅的貢獻一般(捂臉)。

雖然我沒有對國力提升做出什麼不可磨滅的貢獻,但是我可以探索下動態條形圖是怎樣繪製的,應該也算是傳播知識了吧(笑哭)。

查看並選取符合要求數據

先看下數據,依然是英超各球隊的積分數據,製作動態條形圖,對數據量要求會稍微大一些,對於有時間維度的數據來說,時間越長,能體現的變化和信息量就會越多,這裡我們只選取了從2010–2019年英超各球隊的積分數據,這個數據量不算大,但是不影響學習原理和實現步驟。

選取每年前十的球隊進入數據集,最終的數據集長這個樣子:

我們一步一步來,先繪製一個簡單的條形圖,比如繪製2019年排名前十球隊積分的條形圖,準備數據,把2019年的數據提取出來然後進行排序並選擇前十名的球隊數據,具體代碼如下:

year = 2019dff = (df_t[df_t["年份"].eq(year)] .sort_values(by='積分', ascending=True) .tail(10))dff

結果:

簡單解釋下,這裡並沒有複雜的代碼,都是常用的語法,除了一個df.eq(),這個方法主要是進行對比,將df中符合括號內變量要求的數據並提取出來,原始的數據中包含了從2010–2019的所有數據,這裡只需要2019年的,所以通過這種方式把2019年的數據提取出來。

後邊的排序語法選擇升序排序,這樣排在第一位的是積分最少的球隊,所以要選取排名前十的球隊不能用head(10),而是用tail(10),選取結尾的10行。之所以這麼操作,還是由於條形圖繪製過程中是從下往上畫,為了條形的排序是從下往上條形越來越長,所以採用這樣的操作。

來看一下上邊截取出來的數據集繪製出來的條形圖是什麼樣子的:

plt.figure(figsize=(10,6))plt.barh(dff['球隊'], dff['積分']);

ok,畫出來是符合要求的條形圖!

設置條形顏色

如果不設置顏色,畫出來的所有條都是一個顏色,就像上邊的那幅圖。

為了讓圖形更美觀,對各個球隊的積分變化看起來更明顯,還是要設置一下顏色。這裡有兩個選擇,一是對排名設置顏色,即無論哪個球隊是第一名,只要排到第一名就會被指定這種顏色,還有一種是給每個球隊指定顏色,無論這個球隊排名是多少,它的顏色都不會變。

實踐證明第二種方法更複雜一點,但是更容易被接受,所以這裡採用的第二種方法來設置顏色。

names = df_t10.球隊.unique() #查看排名進過前十的球隊都有哪些names

返回結果一共24個球隊:

array(['曼聯', '切爾西', '曼城', '阿森納', '熱刺', '利物浦', '埃弗頓', '富勒姆', '阿斯頓維拉', '桑德蘭', '紐卡斯爾', '西布羅姆維奇', '斯旺西', '西漢姆聯', '南安普敦', '斯託克城', '水晶宮', '萊斯特', '伯恩茅斯', '西布朗', '伯恩利', '萊斯特城', '狼隊', '謝菲爾德聯'], dtype=object)

生成24個不同的顏色:

import matplotlib.cm as cmc = []for i in range(len(names)): c.append(cm.nipy_spectral(float(i)/len(names)))colors1 = dict(zip(names,c)) # 每個球隊對應一個顏色

由於顏色種類比較多,一一指定太費時間和精力,所以引入matplotlib.cm色譜,cm.nipy_spectral()函數,賦給它不同的浮點數數值能夠生成不同的顏色。

plt.figure(figsize=(12,6)) #給不同的條形添加不同顏色的時候注意顏色列表有24中顏色,不能直接讓顏色等於顏色列表for i in range(len(dff)): plt.barh(dff['球隊'].iloc[i], dff['積分'].iloc[i], color=colors1[dff['球 隊'].iloc[i]],alpha = 0.5) # 在畫布右方添加年份plt.text(1, 0.4, current_year, transform=ax.transAxes, size=46, ha='right',alpha=0.5);

效果圖:

實現動圖

其實大家都知道,所謂視頻也是由一幀一幀的畫面組成按照順序播放形成視頻的,而我們的動圖運用的也是這個原理,所以只需把繪製條形圖的代碼封裝成一個函數,然後重複調用這個函數在不同的數據集上繪製圖形就可以實現動態展現。

fig, ax = plt.subplots(figsize=(12, 6)) #同時建立畫布和子畫布,沒有設置默認為一個子畫布def draw_bar(year): ax.spines['right'].set_color('none') #把右邊的邊框顏色設置為無色,隱藏右邊框 ax.spines['top'].set_color('none') #把上邊的邊框顏色設置為無色,隱藏上邊框 ax.spines['left'].set_color('none') #把右邊的邊框顏色設置為無色,隱藏左邊框 ax.spines['bottom'].set_color('none') #把上邊的邊框顏色設置為無色,隱藏下邊框 #準備數據 dff = (df_t[df_t["年份"].eq(year)].sort_values(by='積分', ascending=True).tail(10)) ax.clear() #清空已存在的圖像 for i in range(len(dff)): colors =cm.nipy_spectral(float(i)/len(dff)) ax.barh(dff['球隊'].iloc[i], dff['積分'].iloc[i], height=0.7, color=colors1[dff['球隊'].iloc[i]],alpha = 0.5) ax.text(dff['積分'].iloc[i]-3,i+0.1,dff['球隊'].iloc[i]) ax.text(dff['積分'].iloc[i]-2,i-0.3,dff['積分'].iloc[i]) ax.text(1, 0.4, year, transform=ax.transAxes, color='#777777', size=46, ha='right',alpha=0.5, weight=800) ax.xaxis.set_major_formatter(ticker.StrMethodFormatter('{x:,.0f}')) ax.xaxis.set_ticks_position('top') ax.tick_params(axis='x', colors='#777777', labelsize=12) ax.set_yticks([]) ax.margins(0, 0.01) ax.grid(which='major', axis='x', linestyle='-') ax.set_axisbelow(True) ax.text(0.2, 1.1, '2010--2019英超各球隊年度積分', transform=ax.transAxes, size=20, weight=600, ha='left'); draw_bar(2019)

函數已經封裝好了,接下來是激動人心實現動圖的操作了,需要matplotlib中的animation模塊,運用該模塊中的FuncAnimation方法重複調用前邊定義好的畫圖函數,實現動畫效果:

import matplotlib.animation as animation #導入animation模塊from IPython.display import HTML #導入HTML模塊 fig, ax = plt.subplots(figsize=(10, 6))animator = animation.FuncAnimation(fig, draw_bar, frames=range(2010, 2020),interval = 600) #interval控制更迭速度,默認200毫秒HTML(animator.to_jshtml()) #將渲染的HTML輸出嵌入到iPython輸出中animator.save('yingchao.gif',writer='imagemagick') # 保存 gif 動態圖

動態條形圖就完活兒了,代碼沒有很複雜,完整的過程就最後的兩段代碼,前期的代碼主要是分解了中間的過程,方便理解而已,有興趣的小夥伴可以深入研究或者換個數據集看下實現效果。

相關焦點

  • 如何用matplotlib繪圖呢?
    什麼是matplotlib?使用過python做數據分析的小夥伴都知道,matplotlib是一款命令式、較底層、可定製性強、圖表資源豐富、簡單易用、出版質量級別的python 2D繪圖庫。matplotlib算是python繪圖的元老級庫,類似程式語言裡的C語言。很多其它的python繪圖庫是基於matplotlib開發的,比如seaborn、ggplot、plotnine、holoviews、basemap等。matplotlib可用於python腳本、python shell、jupyter notebook、web等。
  • 基於Python的圖表繪圖系統matplotlib,「餅圖「「你真了解嗎?
    喏,這是從維基百科搬運過來的對餅圖的解釋,請安心受下:餅圖,或稱餅狀圖,是一個劃分為幾個扇形的圓形統計圖表,用於描述量、頻率或百分比之間的相對關係。在餅圖中,每個扇區的弧長(以及圓心角和面積)大小為其所表示的數量的比例。這些扇區合在一起剛好是一個完全的圓形。顧名思義,這些扇區拼成了一個切開的餅形圖案。
  • matplotlib繪圖的核心原理講解
    作者:朱小五來自:凹凸數據(ID:alltodata)matplotlib是基於Python語言的開源項目,旨在為Python提供一個數據繪圖包。相信大家都用過它來數據可視化,之前我還分享過25個常用Matplotlib圖的Python代碼。可是你了解過它繪圖的核心原理嗎?
  • 使用Matplotlib繪製堆積條形圖
    df_grouped = df.groupby('Platform').sum()[['NA_Sales','EU_Sales','JP_Sales','Other_Sales', 'Global_Sales']]df_grouped數據中的值太多了,即使排除空記錄,圖表中的條形圖也會太多。我們為每個平臺和區域繪製一個條形圖,並查看結果。
  • 基於Python圖表繪圖系統:matplotlib散點圖和氣泡圖,你了解嗎?
    慣例先來簡單介紹下什麼是散點圖:用兩組數據構成多個坐標點,考察坐標點的分布,判斷兩變量之間是否存在某種關聯或總結坐標點的分布模式。散點圖將序列顯示為一組點。值由點在圖表中的位置表示。類別由圖表中的不同標記表示。
  • Python繪圖筆記:繪製四色散點圖和誤差條形圖
    figure1#導入繪製散點圖所需要的包import matplotlib.pyplot as pltfrom numpy.random import rand#生成繪圖所需的圖紙fig, ax = plt.subplots
  • matplotlib的Python數據可視化和探索——入門指南
    Matplotlib可用於Python腳本,Python和IPython外殼,Jupyter筆記本,Web應用程式伺服器以及四個圖形用戶界面工具包。」您可以使用matplotlib繪製各種圖表和可視化效果。在本教程中,我將探索matplotlib Python庫中最常見的圖。我們將首先了解手頭的數據集,然後開始使用matplotlib構建不同的圖,包括散點圖和折線圖!
  • python學習筆記:同時畫多圖,折線圖,箱線圖,條形圖,柱狀圖等
    1.同時畫六張圖#從Matplotlib中導入了pyplot繪圖模塊from matplotlib.pyplot import *#設置相關的數值x=[1,2,3,4]y=[5,4,3,2]#創建一個圖紙(figure)figure()#使用subplot創建多個子圖,下面的subplot(2,3,1)表示創建一個包含2行3列圖表的圖紙,1表示第一張圖subplot
  • Python 繪圖庫 Matplotlib 入門教程
    /Matplotlib是一個Python語言的2D繪圖庫,它支持各種平臺,並且功能強大,能夠輕易繪製出各種專業的圖像。很顯然,繪製出來的值對應了圖中的縱坐標(y軸)。而matplotlib本身為我們設置了圖形的橫坐標(x軸):[0, 100],因為我們剛好有100個數值通過plt.show()將這個圖形顯示出來這段代碼非常的簡單,運行起來也是一樣。
  • Matplotlib繪圖|快速定義圖表樣式的小技巧
    Matpltlibrc file 設置圖表屬性Matplotlib 在繪圖過程中,每創建一個圖表,都要對該圖表內的樣式(例如 字體大小、顏色、解析度、橫縱坐標刻度、橫縱坐標標籤)設置一次,重複乏味,如下展示的是一個正弦函數曲線X =np.linspace(-np.pi,np.pi,256,endpoint =True)S = np.sin(X)plt.plot
  • 30分鐘入門 Matplotlib 繪圖
    Matplolib最初主要模仿Matlab的畫圖命令,但是它是獨立於Matlab的,可以自由、免費使用的繪圖包。Matplotlib依賴於之前介紹的Numpy庫來提供出色的繪圖能力。Matplotlib的官網地址http:MatplotlibAPI的詳細介紹請參考官網地址:http:Windows,Linux,Mac 三種作業系統都可以安裝Matplotlib庫。以Windows為例,進入CMD窗口中,使用pip命令安裝Matplotlib,系統會自動進行安裝。
  • python matplotlib畫圖教程學習:使用介紹
    本篇文章介紹matplotlib包使用時,需要掌握的一些基本概念。下圖顯示了matplotlib圖形的基本構成部分,如figure(圖形)、axes(子圖形)、title(標題)、legend(圖例)、Major tick(大標尺刻度)、Minor tick(小標尺刻度)、Major tick label(大標尺刻度數值)、Minor tick label(小標尺刻度數值)、Y axis label(y軸指標說明)、X axis label(x軸指標說明)、Line
  • 見識matplotlib:不常見的一面,折線圖!
    眾所周知,matplotlib是python繪圖的基礎包,能夠生成各種各樣2D或者3D的圖形,用法算是多而全的那種,下邊是matplotlib官網首頁作為例子的幾張圖,大家感受一下:什麼?醜拒?不不不,別激動!其實matplotlib一直是一個低調奢華有內涵的包,需要我們透過它樸實無華的外表認清它豐富多彩的內在,來康康這條妖嬈的曲線,有沒有感受到它的召喚?
  • 如何用Python畫一手漂亮的圖表
    · pyplot入門· Matplotlib:子圖· 重要圖形類型· 條形圖· 直方圖· 散點圖· Matplotlib:三維繪圖· 動手演示什麼是Matplotlib?· Matplotlib是一個開源的圖形庫,支持各種圖形類型· 您只需幾行代碼即可生成圖表,直方圖,條形圖和其他類型的圖表· 它通常用於Web應用程式伺服器,shell和Python腳本中。Pyplot入門Pyplot是Matplotlib模塊,它提供了簡單的功能,可將繪圖元素(如線條,圖像,文本等)添加到當前圖形的軸上。
  • Python 繪圖,我只用 Matplotlib
    散點圖散點圖顯示兩組數據的值,如圖1-1所示。每個點的坐標位置由變量的值決定,並由一組不連接的點完成,用於觀察兩種變量的相關性。例如,身高—體重、溫度—維度。圖1-1 散點圖示例使用Matplotlib的scatter()函數繪製散點圖,其中x和y是相同長度的數組序列。
  • 如何構建一個基於可視化理論的完美Python圖表?
    對兩個繪圖工具Matplotlib和Plotly的使用將貫穿本教程。Matplotlib的logo;Plotly的logo。1. Matplotlib: 這一舊的繪圖引擎驅動了眾多先前的實驗代碼,其對工程師的支持已淪為過去。2. Plotly:數據科學、數據分析以及我的職業生涯未來的繪圖工具。
  • Python數據可視化技能提升—用好matplotlib第1篇
    你說滴這個matplotlib庫到底是啥東東呢?那咱們就說一下吧!其實呢,matplotlib庫是Python中用於繪製二維啦、三維啦等這些圖標的數據可視化工具哦,它滴特點也是很有優勢滴,比如它可以使用一些簡單的繪圖語句就可實現複雜的繪圖效果,而且可以以交互式操作實現漸趨精細的圖形效果,此外呢還可以對圖表的組成元素實現精細化控制,還有等等特點和優勢,說到這你是不是已經對matplotlib的興趣激增了呢?好啦,那咱們就正式開始介紹matplotlib庫吧!
  • python可視化(三)seaborn單變量分析繪圖(直方圖、條形圖)
    本篇文章主要講2個繪圖函數,那就是繪製直方圖的函數seaborn,distplot()和繪製條形圖的函數seaborn.barplot()(關於直方圖和條形圖的區別請查閱前面matplotlib系列中的相關文章)。處理繪圖數據今天我們用直方圖和條形圖展示下NBA2017-2018賽季各球員薪資情況。
  • 這麼用MatPlotLib視覺化呈現數據,你值得擁有!
    使用畫中畫python -m pip install -U pippython -m pip install -U matplotlib2. 使用Python科學包有許多第三方科學包,如:· Anaconda· Canopy· Activestate本文最推薦Anaconda。
  • Python可視化很簡單,一文學會繪製柱狀圖、條形圖和直方圖
    matplotlib庫作為Python數據化可視化的最經典和最常用庫,掌握了它就相當於學會了Python的數據化可視化,通過前幾次呢,咱們已經討論了使用matplotlib庫中的圖表組成元素的幾個重要函數,相信大家已經學會並掌握了哦,今天呢,咱們再深入一點哦,一起來聊聊關於如何繪製柱狀圖