【Python可視化6】Seaborn之heatmap熱力圖

  • 2020 年 1 月 23 日
  • 筆記

Seaborn是基於matplotlib的Python可視化庫。它提供了一個高級界面來繪製有吸引力的統計圖形。Seaborn其實是在matplotlib的基礎上進行了更高級的API封裝,從而使得作圖更加容易,不需要經過大量的調整就能使你的圖變得精緻。

註:所有代碼均在IPython notebook中實現

· 正 · 文 · 來 · 啦 ·

heatmap 熱力圖

熱力圖在實際中常用於展示一組變量的相關係數矩陣,在展示列聯表的數據分佈上也有較大的用途,通過熱力圖我們可以非常直觀地感受到數值大小的差異狀況。heatmap的API如下所示:

下面將演示這些主要參數的用法,第一件事還是先導入相關的packages。

1import seaborn as sns  2%matplotlib inline  3sns.set(font_scale=1.5)

本次演示採用的數據集是Seaborn中內置的flights航班數據集

1#導入數據集後按年月兩個維度進行數據透視  2data=sns.load_dataset("flights")  3        .pivot("month","year","passengers")  4data.head() 

如上圖所示,dataframe中的數據代表了1949年-1960年每個月的航班乘客數量,接下來熱力圖就隆重登場啦!

1sns.set_context({"figure.figsize":(8,8)})  2sns.heatmap(data=data,square=True)  3#可以看到熱力圖主要展示的是二維數據的數據關係  4#不同大小的值對應不同的顏色深淺

熱力圖的右側是顏色帶,上面代表了數值到顏色的映射,數值由小到大對應色彩由暗到亮。從上面的heatmap中我們可以得到兩層信息,一是隨着時間的推移,飛機的乘客數量是在逐步增多的,二是航班的乘坐旺季在七月和八月份。下面就具體的參數進行演示。

vmax:設置顏色帶的最大值 vmin:設置顏色帶的最小值

1sns.heatmap(data=data,vmin=200,  2            vmax=500)

可以看到右側的顏色帶最大最小值變了,而heatmap中顏色映射關係也會隨之調整,將本圖和上面的圖進行對比便一目了然。

cmap:設置顏色帶的色系

1sns.heatmap(data=data,cmap="RdBu_r")

好像變好看了?

center:設置顏色帶的分界線

1sns.heatmap(data=data,cmap="RdBu_r",  2            center=300)

細心的朋友可以察覺到顏色帶上色彩兩級的分界線變成了300

annot:是否顯示數值注釋

1sns.heatmap(data=data,annot=True,  2            cmap="RdBu_r")

怎麼回事?亂碼了嗎?其實數值注釋默認顯示的是科學記數法的數值,我們得把數值進行格式化,這就用到了下面的參數。

fmt:format的縮寫,設置數值的格式化形式

1sns.heatmap(data=data,annot=True,  2            fmt="d",cmap="RdBu_r")  3#foramt為int類型

linewidths:控制每個小方格之間的間距

1sns.heatmap(data=data,annot=True,  2            fmt="d",linewidths=0.3,  3            cmap="RdBu_r")  4#可以看到每個小方格之產生了間隙

linecolor:控制分割線的顏色

1sns.heatmap(data=data,annot=True,  2            fmt="d",linewidths=0.3,  3            linecolor="grey",cmap="RdBu_r")  4#原來的白色間隙變成了灰色間隙

cbar_kws:關於顏色帶的設置

1sns.heatmap(data=data,annot=True,  2            fmt="d",cmap="RdBu_r",  3            cbar_kws={"orientation":"horizontal"})  4#橫向顯示顏色幫

mask:傳入布爾型矩陣,若為矩陣內為True,則熱力圖相應的位置的數據將會被屏蔽掉(常用在繪製相關係數矩陣圖)

 1import numpy as np   2#隨機生成一個200行10列的數據集   3data_new = np.random.randn(200,10)   4   5#求出這個數據集的相關係數矩陣   6corr = np.corrcoef(data_new,rowvar=False)   7   8#以corr的形狀生成一個全為0的矩陣   9mask = np.zeros_like(corr)  10  11#將mask的對角線及以上設置為True  12#這部分就是對應要被遮掉的部分  13mask[np.triu_indices_from(mask)] = True  14  15with sns.axes_style("white"):  16    sns.heatmap(corr, mask=mask, vmax=0.3,  17                annot=True,cmap="RdBu_r")

如果大家對上面的代碼流程不大了解,可以把mask打印出來看看

參照mask和上面繪製的圖,應該就很容易理解了,mask中為1的部分,就是要被蓋掉的部分。演示到此為止,想更深入的學習可以自行查閱官方文檔!