| 系列文章目錄第一章 使用 matplotlib 繪制折線圖第二章 使用 matplotlib 繪制條形圖
 第三章 使用 matplotlib 繪制直方圖
 第四章 使用 matplotlib 繪制散點圖
 第五章 使用 matplotlib 繪制餅圖
 第六章 使用 matplotlib 繪制熱力圖
 第七章 使用 matplotlib 繪制堆疊條形圖
 第八章 使用 matplotlib 在一個畫布內(nèi)繪制多個圖
 
 
 前言上一章我們講述了熱力圖的繪制,本章我們來講述堆疊條形圖的繪制。 
 一、什么是堆疊條形圖?堆疊條形圖是一種用來分解整體、比較各部分的圖。與條形圖類似,堆疊條形圖常被用于比較不同類別的數(shù)值。而且,它的每一類數(shù)值內(nèi)部,又被劃分為多個子類別,這些子類別一般用不同的顏色來表示。 如果說條形圖可以幫助我們觀察總量,那么堆疊條形圖則可以同時反映總量與結(jié)構(gòu),即總量是多少?它又是由哪些部分構(gòu)成的?進(jìn)而,我們還可以探究哪一部分比例最大,以及每一部分的變動情況等等。 二、堆疊條形圖的繪制堆疊條形圖的繪制和條形圖類似,同樣是調(diào)用 bar 函數(shù),只不過在參數(shù)設(shè)置時稍有區(qū)別,示例代碼如下: # importing package
import matplotlib.pyplot as plt
import numpy as np
plt.style.use('fivethirtyeight')
  
x = ['A', 'B', 'C', 'D']
y1 = np.array([10, 20, 10, 30])
y2 = np.array([20, 25, 15, 25])
y3 = np.array([12, 15, 19, 6])
y4 = np.array([10, 29, 13, 19])
  
plt.bar(x, y1, label='Round1', width=0.67)
plt.bar(x, y2, bottom=y1, label='Round2', width=0.67)
plt.bar(x, y3, bottom=y1+y2, label='Round3', width=0.67)
plt.bar(x, y4, bottom=y1+y2+y3, label='Round4', width=0.67)
plt.xlabel("Teams")
plt.ylabel("Score")
plt.legend()
plt.title("Scores by Teams in 4 Rounds")
plt.tight_layout()
plt.show()
 在上面的代碼中,列表 x 代表 4 只隊伍,列表 y1、y2、y3 和 y4 分別表示 4 只隊伍在 4 局比賽的得分。在進(jìn)行圖形繪制時,在繪制 y2 數(shù)據(jù)時,設(shè)置 bottom = y1,意思是在 y1 數(shù)據(jù)繪制的條形圖的基礎(chǔ)進(jìn)行繪制,也就是形成堆疊圖。代碼執(zhí)行完得到的圖形如下圖所示:
  在上圖中,y1 列表對應(yīng)的條形圖在最底部,y2 列表對應(yīng)的條形圖位于 y1 列表對應(yīng)條形圖的上面,后面以此類推。上面的堆疊條形圖是垂直方向的,和前面的條形圖一樣,我們同樣的可以繪制水平方向的堆疊條形圖。例如:
 import matplotlib.pyplot as plt
import numpy as np
plt.style.use('fivethirtyeight')
  
x = ['A', 'B', 'C', 'D']
y1 = np.array([10, 20, 10, 30])
y2 = np.array([20, 25, 15, 25])
y3 = np.array([12, 15, 19, 6])
y4 = np.array([10, 29, 13, 19])
  
plt.barh(x, y1, label='Round1', height=0.67)
plt.barh(x, y2, left=y1, label='Round2', height=0.67)
plt.barh(x, y3, left=y1+y2, label='Round3', height=0.67)
plt.barh(x, y4, left=y1+y2+y3, label='Round4', height=0.67)
plt.xlabel("Score")
plt.ylabel("Teams")
plt.legend()
plt.title("Scores by Teams in 4 Rounds")
plt.tight_layout()
plt.show()
 在繪制水平方向的堆疊條形圖時,需要將參數(shù) bottom 改為 left,將參數(shù) width 改為 height,需要將 x 軸標(biāo)簽改為 Score,y 軸標(biāo)簽改為 Teams。其他的和垂直方向的堆疊條形圖的繪制類似。代碼執(zhí)行后得到的圖形如下圖所示:
  如上圖所示,堆疊條形圖的方向有垂直變成了水平,但是圖例遮擋了部分條形圖,下面我們將圖例的位置移到右下角。例如:
 import matplotlib.pyplot as plt
import numpy as np
plt.style.use('fivethirtyeight')
  
x = ['A', 'B', 'C', 'D']
y1 = np.array([10, 20, 10, 30])
y2 = np.array([20, 25, 15, 25])
y3 = np.array([12, 15, 19, 6])
y4 = np.array([10, 29, 13, 19])
  
plt.barh(x, y1, label='Round1', height=0.67)
plt.barh(x, y2, left=y1, label='Round2', height=0.67)
plt.barh(x, y3, left=y1+y2, label='Round3', height=0.67)
plt.barh(x, y4, left=y1+y2+y3, label='Round4', height=0.67)
plt.xlabel("Score")
plt.ylabel("Teams")
plt.legend(loc='lower right')
plt.title("Scores by Teams in 4 Rounds")
plt.tight_layout()
plt.show()
 在上面的代碼中,我們通過設(shè)置 legend 函數(shù)的 loc 參數(shù)來改變圖例的位置。
  如上圖所示,我們將圖例的位置由右上角改為了右下角。
 三、應(yīng)用場景1.適用場景對比不同類別數(shù)據(jù)的數(shù)值大小,同時對比每一類別數(shù)據(jù)中,子類別的構(gòu)成及大小。 2.不適用場景對于堆疊柱狀圖來說,很多色塊不處于同一水平線上,因此難以比較。所以,如果需要清楚的比較數(shù)值,建議采用分組柱狀圖,讓每一根柱子的高度都顯而易見。當(dāng)堆疊的類型過多,很容易讓人眼花繚亂。
 
 總結(jié)本章我們講了堆疊條形圖的繪制以及堆疊條形圖的適用場景和不適用場景。 
 |