1. 程式人生 > >Python使用matplotlib繪製堆積圖

Python使用matplotlib繪製堆積圖

堆積圖,在計算機視覺的論文中是相當常見而表現力極強的一種圖示方法,其表現為:

固定高度的矩形中,根據某一些數值意義相同的不同變數根據其數值大小佔據矩形中連續的高度;

其與餅圖相相似,都可以很清晰地表示不同變數所佔比重大小的不同;

而它又優於餅圖,當我們把不同時間狀態下的比較結果拼接起來後,就可以很清楚看到隨著時間的演進或者程序的進行,這些變數的權重比例發生的變化和趨勢!

效果如下——

(一)原理

如上圖所示,堆積圖的形成原理即是先在同一個位置畫出不同高度的圖,新的高度是基於之前的所有值的和,再增加自身的高度得到的;

最後的工作就是把他們按照順序疊在一起就可以了。一般來說,matplotlib如果沒有特殊說明(呼叫 plt.close())那麼就會在原來圖的基礎上繼續做圖。

(二)程式碼實現

import matplotlib.pyplot as plt
import os
import numpy as np

col = ['yellow', 'lightskyblue', 'lightgreen', 'maroon', 
       'mediumseagreen', 'mediumvioletred', 'paleturquoise', 'pink', 
       'salmon', 'seagreen', 'orangered', 'olive', 'navy']
# 定義我們的顏色集合,沒有特別說明的話,系統也會自己配置

"""
假設我們要畫一個 m 行 n 列的堆積圖,我們需要
矩陣:M --[m,n]
Steps:
    1) 手動蓋第一層
        plt.bar(np.range(n), M[0], label, color)
        引數含義:a. 規定我們這個圖有幾條柱子 --[0, 1, 2, ..., (n-1)]
                 b. 作用於 M 的第一行 --[n,]
                 c. 第一層的名字(字串)
                 d. 顏色(字串)
"""
plt.bar(sr, M[0] / Div, label='layer_{}'.format(str(0)))

"""
Steps:
    2) for 迴圈繼續構建剩餘的層
        plt.bar(np.range(n), M[0], bottom, label, color)
        引數含義:a. 規定我們這個圖有幾條柱子 --[0, 1, 2, ..., (n-1)]
                 b. 作用於 M 的第一行 --[n,]
                 c. 用之前的值求和作為這一層的基礎 --[n,]
                 d. 第一層的名字(字串)
                 e. 顏色(字串)
"""
for i in range(1, M.shape[0]):
    plt.bar(np.range(n), M[i, :], bottom=np.sum(M[0:i, :], axis = 0), label='layer_{}'.format(str(i)), color=col[i])

plt.legend()
plt.show()

plt.savefig('sample.jpg')# 儲存
plt.close()

如果有多組要保持高度不變的話,可以對每一列做歸一化,即每一列的所有元素除以這一列所有元素的和。