熱圖(Heatmaps)常常用來顯示資料的相關係數(correlation coefficient)。本文章中,我們將介紹如何使用 Python 的 Matplotlib、Seaborn、以及 Plotly Express 套件來繪製熱圖。
Table of Contents
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()
範例的程式碼蠻長的。主要是因為 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 會用 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)
我們發現 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()
我們要改用 create_annotated_heatmap() 來繪製熱圖。其中,注意到我們必須要用參數 x
和 y
來設定 x 軸與 y 軸刻度的標題。然後,呼叫 update_layout() 來設定圖表的標題。最後,fig['data'][0]['showscale'] = True
是用來顯示 colorbar。
結論
我們介紹了三個套件來繪製熱圖,分別為 Matplotlib、Seaborn、以及 Plotly Express。我們可以看出 Seaborn 最易於使用。不過,如果你希望有互動的工具列,那就要改用 Plotly Express 了。