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

2021-01-07 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是python的核心繪圖庫,是python的一個開源項目,旨在為python提供一個繪圖庫。matplotlib與numpy組合是一種可行的matlab替代方案。在可視化中matplotlib是最常使用的工具,是對數據整體判斷、效果預測不可或缺的重要模塊。
  • python:matplotlib入門詳細教程
    行文目錄結構,重點是右三分支matplotlib是python的一個繪圖庫,與numpy、pandas共享數據科學三劍客的美譽,也是很多高級可視化庫的基礎。matplotlib不是python內置庫,調用前需手動安裝,且需依賴numpy庫。截至當前,matplotlib發行版本號為3.2.1,適配python3.6及以上版本。m
  • Python-Matplotlib 動態曲線圖繪製
    引言動態曲線圖不同於動態氣泡圖,它可以查看部分指標在一段時間內的變化趨勢,本期推文將推出動態曲線圖的 Matplotlib 繪製過程,核心過程為 折線圖 和 散點圖 的繪製,詳細過程如下:02.數據可視化動態圖表的繪製主要在於折線圖和散點圖的繪製,我們採用的依舊還是面向對象式繪圖方式,這裡建議繪製較為複雜的圖表時多採用此方法進行繪製。
  • 動態曲線圖(linechart)--Matplotlib繪製
    動態曲線圖不同於動態氣泡圖,它可以查看部分指標在一段時間內的變化趨勢,本期推文將推出動態曲線圖的 Matplotlib 繪製過程,核心過程為 折線圖
  • 高效使用 Python 可視化工具 Matplotlib
    基本前提如果你除了本文之外沒有任何基礎,建議用以下幾個步驟學習如何使用matplotlib:學習基本的matplotlib術語,尤其是什麼是圖和坐標軸始終使用面向對象的接口,從一開始就養成使用它的習慣用基礎的pandas繪圖開始你的可視化學習用seaborn進行更複雜的統計可視化用matplotlib來定製
  • Python 數據分析:Matplotlib 繪圖
    簡介Matplotlib 是 Python 提供的一個繪圖庫,通過該庫我們可以很容易的繪製出折線圖、直方圖、散點圖、餅圖等豐富的統計圖,安裝使用 pip install matplotlib 命令即可,Matplotlib 經常會與 NumPy 一起使用。
  • 基於Python圖表繪圖系統:matplotlib散點圖和氣泡圖,你了解嗎?
    慣例先來簡單介紹下什麼是散點圖:用兩組數據構成多個坐標點,考察坐標點的分布,判斷兩變量之間是否存在某種關聯或總結坐標點的分布模式。散點圖將序列顯示為一組點。值由點在圖表中的位置表示。類別由圖表中的不同標記表示。
  • python數據科學系列:matplotlib入門詳細教程
    行文目錄結構,重點是右三分支matplotlib是python的一個繪圖庫,與numpy、pandas共享數據科學三劍客的美譽,也是很多高級可視化庫的基礎。matplotlib不是python內置庫,調用前需手動安裝,且需依賴numpy庫。截至當前,matplotlib發行版本號為3.2.1,適配python3.6及以上版本。m
  • 基於Python的圖表繪圖系統matplotlib,「餅圖「「你真了解嗎?
    喏,這是從維基百科搬運過來的對餅圖的解釋,請安心受下:餅圖,或稱餅狀圖,是一個劃分為幾個扇形的圓形統計圖表,用於描述量、頻率或百分比之間的相對關係。在餅圖中,每個扇區的弧長(以及圓心角和面積)大小為其所表示的數量的比例。這些扇區合在一起剛好是一個完全的圓形。顧名思義,這些扇區拼成了一個切開的餅形圖案。
  • 「繪圖,讓科學生動起來」:Python-matplotlib繪圖(專題一)python環境搭建篇
    筆者寄語:各位好,從今天開始,「科學是什麼東東」將推出一個全新系列專題:採用時下最流行的python計算機設計語言,對其中的一個第三方繪圖庫,即matplotlib繪圖庫進行講解,並將其強大的繪圖與編程功能應用到數學函數,化學,地理,物理,教育等諸多領域。
  • 讓數據「動」起來:python動態圖表製作
    數據暴增的年代,數據科學家、分析師在被要求對數據有更深的理解與分析的同時,還需要將結果有效地傳遞給他人。當然是將數據可視化啊,而且最好是動態可視化。本文將以線型圖、條形圖和餅圖為例,系統地講解如何讓你的數據圖表動起來。
  • 使用Matplotlib繪製堆積條形圖
    df_grouped = df.groupby('Platform').sum()[['NA_Sales','EU_Sales','JP_Sales','Other_Sales', 'Global_Sales']]df_grouped數據中的值太多了,即使排除空記錄,圖表中的條形圖也會太多。
  • matplotlib繪圖的核心原理講解
    作者:朱小五來自:凹凸數據(ID:alltodata)matplotlib是基於Python語言的開源項目,旨在為Python提供一個數據繪圖包。相信大家都用過它來數據可視化,之前我還分享過25個常用Matplotlib圖的Python代碼。
  • python matplotlib模塊
    調用畫圖方法調用pyplot模塊的繪圖方法畫出圖像,基本的畫圖方法有:plot(將各個點連成曲線圖)、scatter(畫散點圖),bar(畫條形圖)還有更多方法。解析Matplotlib 裡的常用類的包含關係為 Figure -> Axes -> (Line2D, Text, etc.)一個Figure對象可以包含多個子圖(Axes),在matplotlib中用Axes對象表示一個繪圖區域,可以理解為子圖。
  • Python-Matplotlib 動態柱形圖繪製(數據分享)
    這期開始,我們將公眾號剛開始的不成熟風格文章推文改成與現在相統一的風格,同時也為了解決大家複製不了代碼的問題,本期推文,將介紹使用Python-matplotlib 繪製動態柱形圖的教程推文,主要涉及的知識點如下:matplotlib的animation模塊製作動態圖animation
  • Matplotlib入門詳細教程
    matplotlib不是python內置庫,調用前需手動安裝,且需依賴numpy庫。截至當前,matplotlib發行版本號為3.2.1,適配python3.6及以上版本。pylab集成了numpy和pyplot全部功能當了解pylab模塊功能之後,才真正理解開發者的深謀遠慮:原以為matplotlib的意思是"面向矩陣的繪圖庫",哪知其真正意義是"矩陣+繪圖庫",繪圖只是它的一半。
  • Python繪圖筆記:繪製四色散點圖和誤差條形圖
    figure1#導入繪製散點圖所需要的包import matplotlib.pyplot as pltfrom numpy.random#python3 裡面, dict.items改變了默認實現,也返回生成器,因此six.iteritems退出了舞臺。
  • Python可視化:學會Matplotlib這幾點就夠了!
    python分析可視化展示,對於日常的分析中主要用到餅圖、折線圖、直方圖基本能滿足一般的分析可視化呈現。        今天我們就來介紹一下必備的Matplotlib可視化關鍵的幾點,只要了解了這幾點就夠了。
  • matplotlib的Python數據可視化和探索——入門指南
    您可以使用matplotlib繪製各種圖表和可視化效果。在本教程中,我將探索matplotlib Python庫中最常見的圖。我們將首先了解手頭的數據集,然後開始使用matplotlib構建不同的圖,包括散點圖和折線圖!