Python 熱圖(Heatmaps)

Photo by salatt andieu on Unsplash
Photo by salatt andieu on Unsplash
熱圖(Heatmaps)常常用來顯示資料的相關係數(correlation coefficient)。本文章中,我們將介紹如何使用 Python 的 Matplotlib、Seaborn、以及 Plotly Express 套件來繪製熱圖。

熱圖(Heatmaps)常常用來顯示資料的相關係數(correlation coefficient)。本文章中,我們將介紹如何使用 Python 的 Matplotlib、Seaborn、以及 Plotly Express 套件來繪製熱圖。

完整程式碼可以在 下載。

Matplotlib

Matplotlib 並沒有專門用來繪製熱圖的函式,不過我們可以利用它的 imshow() 來繪製熱圖。imshow() 可以將資料繪製成 2D regular raster。Raster 圖與熱圖有著一格一格的共同點,所以我們可以利用它來繪製熱圖。以下是它的宣告,詳細的參數請參考官網

matplotlib.pyplot.imshow(X, cmap=None)
  • X:2 維的資料結構。
  • cmap:Color map。

下面的範例顯示如何使用 imshow() 來繪製熱圖。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

attributes = ['Women Entrepreneurship Index', 'Entrepreneurship Index', 'Inflation rete', 'Female Labor Force Participation Rate']
df = pd.DataFrame([
    [1.0, 0.91, -0.46, 0.44],
    [0.91, 1, -0.4, 0.33],
    [-0.46, -0.4, 1, -0.14],
    [0.44, 0.33, -0.14, 1],
], columns=attributes, index=attributes)

fig, ax = plt.subplots()
im = ax.imshow(df)

ax.set_xticks(np.arange(len(df.columns)))
ax.set_xticklabels(df.columns)
plt.setp(ax.get_xticklabels(), rotation=45, ha="right", rotation_mode="anchor")

ax.set_yticks(np.arange(len(df.index)))
ax.set_yticklabels(df.index)

for i in range(len(df.columns)):
    for j in range(len(df.index)):
        text = ax.text(j, i, df.iloc[i, j], ha="center", va="center", color="w")

ax.set_title("Corr")
plt.show()
Matplotlib heatmap
Matplotlib heatmap

範例的程式碼蠻長的。主要是因為 imshow() 本來就不是專門用來繪製熱圖的。因此,我們先利用 imshow() 繪製出 raster 圖之後,再額外地在 x 軸與 y 軸上加上刻度的標題,然後在每一格中加上資料。最後就會像是熱圖了。

首先,我們先利用 subplots() 建立一個 figure 和 一個 subplot。它回傳的 fig 就是 figure,而 ax 就是 subplot。然後,呼叫 ax.imshow(df) 在 subplot 上將 df 繪製成 raster 圖。

接下來,呼叫 set_xticks() 設定 x 軸上刻度的數量,然後呼叫 set_xticklabels() 設定 x 軸刻度上的標題。對 y 軸也呼叫 set_yticks()set_yticklabels() 來設定刻度。並且,呼叫 setp() 來將 x 軸刻度上的標題旋轉 45 度。

再來就是要設定格子中對應的資料。呼叫 text() 來對每一個格子設定資料。最後,呼叫 set_title() 來設定圖表的標題,並呼叫 show() 將圖表顯示出來。

官網中還有更多的範例顯示如何繪製熱圖,包含如何加上 color bar 和設定格子與格子間的間隔寬度。

Seaborn

Seaborn 的 heatmap() 是專門用來繪製熱圖。以下是它的宣告,其他詳細的參數請參照官網。

seaborn.heatmap(data, cmap=None, cbar=True, annot=None)
  • data:2D 的資料。
  • cmap:Color map。
  • cbar:是否顯示 colorbar。
  • annot:是否在每個格子裡顯示對應的資料。

以下是使用範例。

import pandas as pd
import seaborn as sns

attributes = ['Women Entrepreneurship Index', 'Entrepreneurship Index', 'Inflation rete', 'Female Labor Force Participation Rate']
df = pd.DataFrame([
    [1.0, 0.91, -0.46, 0.44],
    [0.91, 1, -0.4, 0.33],
    [-0.46, -0.4, 1, -0.14],
    [0.44, 0.33, -0.14, 1],
], columns=attributes, index=attributes)

sns.heatmap(df, annot=True)
Seaborn heatmap
Seaborn heatmap

Seaborn 會用 DataFrame 的欄位名稱來當作刻度上的標題。這非常地方便,所以範例程式碼也非常地簡單!

Plotly Express

如同 Matplotlib.imshow() 一樣,Plotly Express 的 imshow() 是用來繪製 2D regular raster。不過,Plotly Express 更加簡單使用。以下是它的宣告,其他詳細的參數請參照官網

plotly.express.imshow(img, labels={}, title=None)
  • img:2 維資料。
  • labels:x 軸與 y 軸刻度的標題。
  • title:圖表的標題。

以下的範例顯示如何用 imshow() 來繪製熱圖。

import pandas as pd
import plotly.express as px

attributes = ['Women Entrepreneurship Index', 'Entrepreneurship Index', 'Inflation rete', 'Female Labor Force Participation Rate']
df = pd.DataFrame([
    [1.0, 0.91, -0.46, 0.44],
    [0.91, 1, -0.4, 0.33],
    [-0.46, -0.4, 1, -0.14],
    [0.44, 0.33, -0.14, 1],
], columns=attributes, index=attributes)

px.imshow(df)
Plotly Express heatmap
Plotly Express heatmap

我們發現 imshow() 所繪製出來的 raster 圖根本就是我們所需要的熱圖。不過,它預設不在每個格子中顯示資料,但是將游標移至每個格子上時,它還是會顯示相關的資料的。

下面的範例顯示如何預設就將資料顯示出來。

import plotly.figure_factory as ff

fig = ff.create_annotated_heatmap(df.values.tolist(),
                                  x=df.columns.values.tolist(),
                                  y=df.index.values.tolist())
fig.update_layout(title_text='Corr')
fig['data'][0]['showscale'] = True
fig.show()
Plotly Express annotated heatmaps
Plotly Express annotated heatmaps

我們要改用 create_annotated_heatmap() 來繪製熱圖。其中,注意到我們必須要用參數 xy 來設定 x 軸與 y 軸刻度的標題。然後,呼叫 update_layout() 來設定圖表的標題。最後,fig['data'][0]['showscale'] = True 是用來顯示 colorbar。

結論

我們介紹了三個套件來繪製熱圖,分別為 Matplotlib、Seaborn、以及 Plotly Express。我們可以看出 Seaborn 最易於使用。不過,如果你希望有互動的工具列,那就要改用 Plotly Express 了。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

You May Also Like