python數據可視化Seaborn畫熱力圖

1.引言

熱力圖的想法很簡單,用顏色替換數字。

在這裡插入圖片描述

現在,這種可視化風格已經從最初的顏色編碼表格走瞭很長一段路。熱力圖被廣泛用於地理空間數據。這種圖通常用於描述變量的密度或強度,模式可視化、方差甚至異常可視化等。

鑒於熱力圖有如此多的應用,本文將介紹如何使用Seaborn 來創建熱力圖。

2. 栗子

首先我們導入PandasNumpy庫,這兩個庫可以幫助我們進行數據預處理。

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生成瞭熱力圖,但是圖像中還有兩個空的單元格(紅色圓圈所示)。

我們當然可以在繪制的時候將其進行過濾。即分別將和上述圓圈對應的maskdf_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,SaturationLightness。這裡我們查閱網站來選擇我們接下來設置的調色板的顏色。

最後但是最最重要的一點,不要忘瞭在我們的圖像上設置標題,使用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!

推薦閱讀: