python數據可視化Seaborn畫熱力圖
1.引言
熱力圖的想法很簡單,用顏色替換數字。
現在,這種可視化風格已經從最初的顏色編碼表格走瞭很長一段路。熱力圖被廣泛用於地理空間數據。這種圖通常用於描述變量的密度或強度,模式可視化、方差甚至異常可視化等。
鑒於熱力圖有如此多的應用,本文將介紹如何使用Seaborn
來創建熱力圖。
2. 栗子
首先我們導入Pandas
和Numpy
庫,這兩個庫可以幫助我們進行數據預處理。
import pandas as pd import matplotlib.pyplot as plt import seaborn as sb import numpy as np
為瞭舉例,我們采用的數據集是 80 種不同谷物的樣本,我們來看看它們的成分。
數據集樣例如下所示:
上圖中,第一行為表頭,接著對於每一行來說,第一列為谷物的名稱,後面第4列到16列為每種谷物含有的13種主要組成成分的數值。
3. 數據預處理
解下來我們分析每種谷物13種不同成分之間的相關性,我們可以采用Pandas庫中的coor()函數來計算相關性,
代碼如下:
# read dataset df = pd.read_csv('data/cereal.csv') # get correlations df_corr = df.corr() # 13X13 print(df_corr)
得到結果如下:
calories protein fat … weight cups rating
calories 1.000000 0.019066 0.498610 … 0.696091 0.087200 -0.689376
protein 0.019066 1.000000 0.208431 … 0.216158 -0.244469 0.470618
fat 0.498610 0.208431 1.000000 … 0.214625 -0.175892 -0.409284
sodium 0.300649 -0.054674 -0.005407 … 0.308576 0.119665 -0.401295
fiber -0.293413 0.500330 0.016719 … 0.247226 -0.513061 0.584160
carbo 0.250681 -0.130864 -0.318043 … 0.135136 0.363932 0.052055
sugars 0.562340 -0.329142 0.270819 … 0.450648 -0.032358 -0.759675
potass -0.066609 0.549407 0.193279 … 0.416303 -0.495195 0.380165
vitamins 0.265356 0.007335 -0.031156 … 0.320324 0.128405 -0.240544
shelf 0.097234 0.133865 0.263691 … 0.190762 -0.335269 0.025159
weight 0.696091 0.216158 0.214625 … 1.000000 -0.199583 -0.298124
cups 0.087200 -0.244469 -0.175892 … -0.199583 1.000000 -0.203160
rating -0.689376 0.470618 -0.409284 … -0.298124 -0.203160 1.000000[13 rows x 13 columns]
接著我們移除相關性不大的最後幾個成分,代碼如下:
# irrelevant fields fields = ['rating', 'shelf', 'cups', 'weight'] # drop rows df_corr.drop(fields, inplace=True) # 9X13 # drop cols df_corr.drop(fields, axis=1, inplace=True) # 9X9 print(df_corr)
得到結果如下:
我們知道相關性矩陣是對稱矩陣,矩陣中上三角和下三角的值是相同的,這帶來瞭很大的重復。
4. 畫熱力圖
非常幸運的是我們可以使用Mask矩陣來生成Seaborn
中的熱力圖,那麼我們首先來生成Mask矩陣。
np.ones_like(df_corr, dtype=np.bool)
結果如下:
接著我們來得到上三角矩陣,在Numpy
中使用np.triu
函數可以返回上三角矩陣對應的Mask,
如下所示:
mask = np.triu(np.ones_like(df_corr, dtype=np.bool))
結果如下:
接下來我們畫熱力圖,如下所示:
sb.heatmap(df_corr,mask=mask) plt.show()
此時的運行結果如下:
5. 添加數值
觀察上圖,我們雖然使用Mask
生成瞭熱力圖,但是圖像中還有兩個空的單元格(紅色圓圈所示)。
我們當然可以在繪制的時候將其進行過濾。即分別將和上述圓圈對應的mask
和df_corr
過濾掉,
代碼如下:
# adjust mask and df mask = mask[1:, :-1] corr = df_corr.iloc[1:, :-1].copy()
同時我們可以設置heatmap
相應的參數,讓其顯示對應的數值,
完整代碼如下:
def test2(): # read dataset df = pd.read_csv('data/cereal.csv') # get correlations df_corr = df.corr() # 13X13 # irrelevant fields fields = ['rating', 'shelf', 'cups', 'weight'] df_corr.drop(fields, inplace=True) # 9X13 # drop cols df_corr.drop(fields, axis=1, inplace=True) # 9X9 mask = np.triu(np.ones_like(df_corr, dtype=np.bool)) # adjust mask and df mask = mask[1:, :-1] corr = df_corr.iloc[1:, :-1].copy() # plot heatmap sb.heatmap(corr, mask=mask, annot=True, fmt=".2f", cmap='Blues', vmin=-1, vmax=1, cbar_kws={"shrink": .8}) # yticks plt.yticks(rotation=0) plt.show()
運行結果如下:
6. 調色板優化
接著我們繼續優化可視化的效果,考慮到相關系數的范圍為-1到1,所以顏色變化有兩個方向。基於此,由中間向兩側發散的調色板相比連續的調色板視覺效果會更好。如下所示為發散的調色板示例:
在Seaborn庫中存在生成發散調色板的函數 driverging_palette,
該函數用於構建colormaps
,每側使用一種顏色,並在中心匯聚成另一種顏色。
這個函數的完整形式如下:
diverging_palette(h_neg, h_pos, s=75, l=50, sep=1,n=6, center=“light”, as_cmap=False)
該函數使用顏色表示形式為HUSL
,即hue
,Saturation
和Lightness
。這裡我們查閱網站來選擇我們接下來設置的調色板的顏色。
最後但是最最重要的一點,不要忘瞭在我們的圖像上設置標題,使用title
函數即可。
完整代碼如下:
def test3(): # read dataset df = pd.read_csv('data/cereal.csv') # get correlations df_corr = df.corr() # 13X13 # irrelevant fields fields = ['rating', 'shelf', 'cups', 'weight'] df_corr.drop(fields, inplace=True) # 9X13 # drop cols df_corr.drop(fields, axis=1, inplace=True) # 9X9 fig, ax = plt.subplots(figsize=(12, 10)) # mask mask = np.triu(np.ones_like(df_corr, dtype=np.bool)) # adjust mask and df mask = mask[1:, :-1] corr = df_corr.iloc[1:, :-1].copy() # color map cmap = sb.diverging_palette(0, 230, 90, 60, as_cmap=True) # plot heatmap sb.heatmap(corr, mask=mask, annot=True, fmt=".2f", linewidths=5, cmap=cmap, vmin=-1, vmax=1, cbar_kws={"shrink": .8}, square=True) # ticks yticks = [i.upper() for i in corr.index] xticks = [i.upper() for i in corr.columns] plt.yticks(plt.yticks()[0], labels=yticks, rotation=0) plt.xticks(plt.xticks()[0], labels=xticks) # title title = 'CORRELATION MATRIX\nSAMPLED CEREALS COMPOSITION\n' plt.title(title, loc='left', fontsize=18) plt.show()
運行結果如下:
是不是看上去高大上瞭很多。人類果然還是視覺動物。
到此這篇關於數據可視化Seaborn
畫熱力圖的文章就介紹到這瞭,更多相關Seaborn畫熱力圖內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- python熱力圖實現的完整實例
- Python數據可視化探索實例分享
- python用opencv 圖像傅裡葉變換
- Python利用Seaborn繪制多標簽的混淆矩陣
- OpenCV圖像變換之傅裡葉變換的一些應用