Matplotlib和Seaborn之熱圖

熱圖

熱圖是直方圖的二維版本,可以替代散點圖。和散點圖一樣,要繪制的兩個數(shù)字變量的值位于坐標軸上。和直方圖類似,圖形區(qū)域被劃分為網(wǎng)格,并將每個網(wǎng)格的點數(shù)加起來。因為沒有空間表示長條高度,因此用網(wǎng)格顏色表示計數(shù)。你可以通過 Matplotlib 的 hist2d 函數(shù)實現(xiàn)熱圖。

plt.figure(figsize = [12, 5])

# left plot: scatterplot of discrete data with jitter and transparency
plt.subplot(1, 2, 1)
sb.regplot(data = df, x = 'disc_var1', y = 'disc_var2', fit_reg = False,
           x_jitter = 0.2, y_jitter = 0.2, scatter_kws = {'alpha' : 1/3})

# right plot: heat map with bin edges between values
plt.subplot(1, 2, 2)
bins_x = np.arange(0.5, 10.5+1, 1)
bins_y = np.arange(-0.5, 10.5+1, 1)
plt.hist2d(data = df, x = 'disc_var1', y = 'disc_var2',
           bins = [bins_x, bins_y])
plt.colorbar();

注意,因為有兩個變量,因此 "bins" 參數(shù)接受了包含兩個分箱邊緣規(guī)格的列表,每個維度一個規(guī)格。和單變量直方圖一樣,選擇合適的分箱尺寸很重要。我們添加了 colorbar 函數(shù)調(diào)用,以向圖形的一側(cè)添加色條,顯示從計數(shù)到顏色的映射。

image.png

隨著熱圖中的顏色越來越亮,從藍色變成黃色,相應(yīng)單元格中的點計數(shù)越來越高。

熱圖還可以用作條形圖的二維版本,按照兩個分類變量(而不是數(shù)字變量)的計數(shù)繪制圖形。seaborn 中的函數(shù) heatmap 專門用于繪制分類熱圖。稍后我們將在這節(jié)課的“聚類條形圖”部分詳細講解這方面的知識。

其他版本

要選擇其他調(diào)色板,可以在 hist2d 中設(shè)置 "cmap" 參數(shù)。設(shè)置調(diào)色板的最簡單方式是使用字符串引用內(nèi)置 Matplotlib 調(diào)色板。你可以在 Pyplot API 文檔的此部分找到有效字符串列表。下節(jié)課將詳細討論圖形中的顏色。暫時我將通過一個示例介紹如何通過設(shè)置 cmap = 'viridis_r' 更改默認的 "viridis" 調(diào)色板。

此外,我想?yún)^(qū)分計數(shù)為零的單元格和計數(shù)非零的單元格。"cmin" 參數(shù)指定了單元格要達到什么樣的最低值才能繪制出來。在 hist2d 調(diào)用中添加 cmin = 0.5 參數(shù)后,只有至少包含一個數(shù)據(jù)點的單元格才會有顏色。

bins_x = np.arange(0.5, 10.5+1, 1)
bins_y = np.arange(-0.5, 10.5+1, 1)
plt.hist2d(data = df, x = 'disc_var1', y = 'disc_var2',
           bins = [bins_x, bins_y], cmap = 'viridis_r', cmin = 0.5)
plt.colorbar()

image.png

如果你有大量數(shù)據(jù),可能需要向圖形中的單元格添加注釋,表示每個單元格的點數(shù)。在 hist2d 調(diào)用中,我們必須挨個地添加文本元素,就像在上節(jié)課挨個地向條形圖中添加文本元素一樣。我們可以直接通過 hist2d 返回的結(jié)果得出要注釋的計數(shù),該函數(shù)返回的結(jié)果不僅包括圖形對象,還包括計數(shù)數(shù)組和兩個分箱邊緣向量。

# hist2d returns a number of different variables, including an array of counts
bins_x = np.arange(0.5, 10.5+1, 1)
bins_y = np.arange(-0.5, 10.5+1, 1)
h2d = plt.hist2d(data = df, x = 'disc_var1', y = 'disc_var2',
               bins = [bins_x, bins_y], cmap = 'viridis_r', cmin = 0.5)
counts = h2d[0]

# loop through the cell counts and add text annotations for each
for i in range(counts.shape[0]):
    for j in range(counts.shape[1]):
        c = counts[i,j]
        if c >= 7: # increase visibility on darkest cells
            plt.text(bins_x[i]+0.5, bins_y[j]+0.5, int(c),
                     ha = 'center', va = 'center', color = 'white')
        elif c > 0:
            plt.text(bins_x[i]+0.5, bins_y[j]+0.5, int(c),
                     ha = 'center', va = 'center', color = 'black')

image.png

如果熱圖中有太多的單元格,注釋將太多,無法看清。在這種情形下,建議不要添加注釋,直接通過數(shù)據(jù)和色條傳達信息。通常你會在單元格很少的分類熱圖中看到注釋。實際上,seaborn 的 heatmap 函數(shù)中內(nèi)置了一個添加注釋的參數(shù),稍后我們將講解。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容