python數(shù)據(jù)可視化Seaborn畫(huà)熱力圖
1.引言
熱力圖的想法很簡(jiǎn)單,用顏色替換數(shù)字。
現(xiàn)在,這種可視化風(fēng)格已經(jīng)從最初的顏色編碼表格走了很長(zhǎng)一段路。熱力圖被廣泛用于地理空間數(shù)據(jù)。這種圖通常用于描述變量的密度或強(qiáng)度,模式可視化、方差甚至異??梢暬?。
鑒于熱力圖有如此多的應(yīng)用,本文將介紹如何使用Seaborn
來(lái)創(chuàng)建熱力圖。
2. 栗子
首先我們導(dǎo)入Pandas
和Numpy
庫(kù),這兩個(gè)庫(kù)可以幫助我們進(jìn)行數(shù)據(jù)預(yù)處理。
import pandas as pd import matplotlib.pyplot as plt import seaborn as sb import numpy as np
為了舉例,我們采用的數(shù)據(jù)集是 80 種不同谷物的樣本,我們來(lái)看看它們的成分。
數(shù)據(jù)集樣例如下所示:
上圖中,第一行為表頭,接著對(duì)于每一行來(lái)說(shuō),第一列為谷物的名稱,后面第4列到16列為每種谷物含有的13種主要組成成分的數(shù)值。
3. 數(shù)據(jù)預(yù)處理
解下來(lái)我們分析每種谷物13種不同成分之間的相關(guān)性,我們可以采用Pandas庫(kù)中的coor()函數(shù)來(lái)計(jì)算相關(guān)性,
代碼如下:
# read dataset df = pd.read_csv('data/cereal.csv') # get correlations df_corr = df.corr() ?# 13X13 print(df_corr)
得到結(jié)果如下:
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]
接著我們移除相關(guān)性不大的最后幾個(gè)成分,代碼如下:
# 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)
得到結(jié)果如下:
我們知道相關(guān)性矩陣是對(duì)稱矩陣,矩陣中上三角和下三角的值是相同的,這帶來(lái)了很大的重復(fù)。
4. 畫(huà)熱力圖
非常幸運(yùn)的是我們可以使用Mask矩陣來(lái)生成Seaborn
中的熱力圖,那么我們首先來(lái)生成Mask矩陣。
np.ones_like(df_corr, dtype=np.bool)
結(jié)果如下:
接著我們來(lái)得到上三角矩陣,在Numpy
中使用np.triu
函數(shù)可以返回上三角矩陣對(duì)應(yīng)的Mask,
如下所示:
mask = np.triu(np.ones_like(df_corr, dtype=np.bool))
結(jié)果如下:
接下來(lái)我們畫(huà)熱力圖,如下所示:
sb.heatmap(df_corr,mask=mask) plt.show()
此時(shí)的運(yùn)行結(jié)果如下:
5. 添加數(shù)值
觀察上圖,我們雖然使用Mask
生成了熱力圖,但是圖像中還有兩個(gè)空的單元格(紅色圓圈所示)。
我們當(dāng)然可以在繪制的時(shí)候?qū)⑵溥M(jìn)行過(guò)濾。即分別將和上述圓圈對(duì)應(yīng)的mask
和df_corr
過(guò)濾掉,
代碼如下:
# adjust mask and df mask = mask[1:, :-1] corr = df_corr.iloc[1:, :-1].copy()
同時(shí)我們可以設(shè)置heatmap
相應(yīng)的參數(shù),讓其顯示對(duì)應(yīng)的數(shù)值,
完整代碼如下:
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()
運(yùn)行結(jié)果如下:
6. 調(diào)色板優(yōu)化
接著我們繼續(xù)優(yōu)化可視化的效果,考慮到相關(guān)系數(shù)的范圍為-1到1,所以顏色變化有兩個(gè)方向?;诖?,由中間向兩側(cè)發(fā)散的調(diào)色板相比連續(xù)的調(diào)色板視覺(jué)效果會(huì)更好。如下所示為發(fā)散的調(diào)色板示例:
在Seaborn庫(kù)中存在生成發(fā)散調(diào)色板的函數(shù) driverging_palette,
該函數(shù)用于構(gòu)建colormaps
,每側(cè)使用一種顏色,并在中心匯聚成另一種顏色。
這個(gè)函數(shù)的完整形式如下:
diverging_palette(h_neg, h_pos, s=75, l=50, sep=1,n=6, center=“l(fā)ight”, as_cmap=False)
該函數(shù)使用顏色表示形式為HUSL
,即hue
,Saturation
和Lightness
。這里我們查閱網(wǎng)站來(lái)選擇我們接下來(lái)設(shè)置的調(diào)色板的顏色。
最后但是最最重要的一點(diǎn),不要忘了在我們的圖像上設(shè)置標(biāo)題,使用title
函數(shù)即可。
完整代碼如下:
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()
運(yùn)行結(jié)果如下:
是不是看上去高大上了很多。人類果然還是視覺(jué)動(dòng)物。
到此這篇關(guān)于數(shù)據(jù)可視化Seaborn
畫(huà)熱力圖的文章就介紹到這了,更多相關(guān)Seaborn畫(huà)熱力圖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
pandas 對(duì)group進(jìn)行聚合的例子
今天小編就為大家分享一篇pandas 對(duì)group進(jìn)行聚合的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12使用python實(shí)現(xiàn)unix2dos和dos2unix命令的例子
今天小編就為大家分享一篇使用python實(shí)現(xiàn)unix2dos和dos2unix命令的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08實(shí)操Python爬取覓知網(wǎng)素材圖片示例
大家好,本篇文章介紹的是實(shí)操Python爬取覓知網(wǎng)素材圖片示例,感興趣的朋友趕快來(lái)看一看吧,對(duì)你有用的話記得收藏起來(lái),方便下次瀏覽2021-11-11Python?計(jì)算機(jī)視覺(jué)編程進(jìn)階之OpenCV?圖像銳化及邊緣檢測(cè)
計(jì)算機(jī)視覺(jué)這種技術(shù)可以將靜止圖像或視頻數(shù)據(jù)轉(zhuǎn)換為一種決策或新的表示。所有這樣的轉(zhuǎn)換都是為了完成某種特定的目的而進(jìn)行的,本篇我們來(lái)學(xué)習(xí)下如何對(duì)圖像進(jìn)行銳化處理以及如何進(jìn)行邊緣檢測(cè)2021-11-11