1. 程式人生 > >使用matplotlib繪製熱圖(heatmap)

使用matplotlib繪製熱圖(heatmap)

python常用的繪相簿就是matplotlib,今天在給公司繪圖時,偶然間發現matplotlib可以繪製熱圖,並且十分簡潔,拿出來跟大家分享一下。(由於涉及到公司資料問題,這裡採用隨機數生成資料進行實驗)

import random
from matplotlib import pyplot as plt
from matplotlib import cm
from matplotlib import axes
from matplotlib.font_manager import FontProperties
font = FontProperties(fname='/Library/Fonts/Songti.ttc')

def draw():
    #定義熱圖的橫縱座標
    xLabel = ['A','B','C','D','E']
    yLabel = ['1','2','3','4','5']

    #準備資料階段,利用random生成二維資料(5*5)
    data = []
    for i in range(5):
        temp = []
        for j in range(5):
            k = random.randint(0,100)
            temp.append(k)
        data.append(temp)

    #作圖階段
    fig = plt.figure()
    #定義畫布為1*1個劃分,並在第1個位置上進行作圖
    ax = fig.add_subplot(111)
    #定義橫縱座標的刻度
    ax.set_yticks(range(len(yLabel)))
    ax.set_yticklabels(yLabel, fontproperties=font)
    ax.set_xticks(range(len(xLabel)))
    ax.set_xticklabels(xLabel)
    #作圖並選擇熱圖的顏色填充風格,這裡選擇hot
    im = ax.imshow(data, cmap=plt.cm.hot_r)
    #增加右側的顏色刻度條
    plt.colorbar(im)
    #增加標題
    plt.title("This is a title", fontproperties=font)
    #show
    plt.show()

d = draw()

效果圖如下:

為了更清晰地看出二維數值矩陣與熱圖之間的對應關係,我們輸出二維矩陣:

[[17, 96, 11, 99, 83], [18, 17, 58, 18, 80], [87, 79, 15, 53, 4], [86, 53, 48, 36, 23], [25, 4, 94, 100, 71]]
  • 從對應關係我們可以看出,影象的左上角為座標原點,第一行對應的二維矩陣中的第一行資料,以此類推。
  • 同時我們可以看出數值越大的單元,對應熱圖中的顏色越深。其實這是一個可選項,只需要改變
im = ax.imshow(data, cmap=plt.cm.hot_r)

中的引數cmap為hot_r,其中_r的意思是就是按照顏色越深,數值越大,如果想數值越大,顏色越淺,只需要去掉_r,直接為hot就行。同時這個hot是熱圖配色的其中一個主題,主題色引數可選:

hot 從黑平滑過度到紅、橙色和黃色的背景色,然後到白色。
cool 包含青綠色和品紅色的陰影色。從青綠色平滑變化到品紅色。
gray 返回線性灰度色圖。
bone 具有較高的藍色成分的灰度色圖。該色圖用於對灰度圖新增電子的檢視。
white 全白的單色色圖。 
spring 包含品紅和黃的陰影顏色。 
summer 包含綠和黃的陰影顏色。
autumn 從紅色平滑變化到橙色,然後到黃色。 
winter 包含藍和綠的陰影色。
  • 右側的顏色刻度條colorbar也是可選的,如果不寫就不會顯示