Seaborn(sns)官方文檔學習筆記(第三章 分布數據集的可視化)
第三章 分布數據集的可視化
在處理一組數據時,通常首先要做的是了解變數是如何分布的。這一章將簡要介紹seborn中用於檢查單變數和雙變數分布的一些工具。你可能還想看看分類變數的章節,來看看函數的例子,這些函數讓我們很容易比較變數的分布。
%matplotlib inlineimport numpy as npimport pandas as pdfrom scipy import stats, integrateimport matplotlib.pyplot as pltimport seaborn as snssns.set(color_codes=True)np.random.seed(sum(map(ord, "distributions")))
單變數分布
最方便的方式是快速查看單變數分布無疑是使用distplot()函數。默認情況下,這將繪製一個直方圖,並擬合出核密度估計(KDE)。
x = np.random.normal(size=100)sns.distplot(x);
直方圖
直方圖應當是非常熟悉的函數了,在matplotlib中就存在hist函數。直方圖通過在數據的範圍內切成數據片段,然後繪製每個數據片段中的觀察次數,來表示整體數據的分布。
為了說明這一點,我們刪除密度曲線並添加了地毯圖,每個觀察點繪製一個小的垂直刻度。您可以使用rugplot()函數來製作地毯圖,但它也可以在distplot()中使用:
sns.distplot(x, kde=False, rug=True);
繪製直方圖時,主要的選擇是使用切分數據片段的數量或在何位置切分數據片段。 distplot()使用一個簡單的規則來很好地猜測並給予默認的切分數量,但嘗試更多或更少的數據片段可能會顯示出數據中的其他特徵:
sns.distplot(x, bins=20, kde=False, rug=True);
核密度估計(KDE) Kernel density estimaton
或許你對核密度估計可能不像直方圖那麼熟悉,但它是繪製分布形狀的有力工具。如同直方圖一樣,KDE圖會對一個軸上的另一軸的高度的觀測密度進行描述:
sns.distplot(x, hist=False, rug=True);
繪製KDE比繪製直方圖更有計算性。所發生的是,每一個觀察都被一個以這個值為中心的正態( 高斯)曲線所取代。
x = np.random.normal(0, 1, size=30)bandwidth = 1.06 * x.std() * x.size ** (-1 / 5.)support = np.linspace(-4, 4, 200)kernels = []for x_i in x: kernel = stats.norm(x_i, bandwidth).pdf(support) kernels.append(kernel) plt.plot(support, kernel, color="r")sns.rugplot(x, color=".2", linewidth_=3);
接下來,這些曲線可以用來計算支持網格中每個點的密度值。得到的曲線再用歸一化使得它下面的面積等於1:
density = np.sum(kernels, axis=0)density /= integrate.trapz(density, support)plt.plot(support, density);
我們可以看到,如果我們在seaborn中使用kdeplot()函數,我們得到相同的曲線。 這個函數由distplot()使用,但是當您只想要密度估計時,它提供了一個更直接的界面,更容易訪問其他選項:
sns.kdeplot(x, shade=True);
KDE的帶寬bandwidth(bw)參數控制估計對數據的擬合程度,與直方圖中的bin(數據切分數量參數)大小非常相似。 它對應於我們上面繪製的內核的寬度。 默認中會嘗試使用通用引用規則猜測一個適合的值,但嘗試更大或更小的值可能會有所幫助:
sns.kdeplot(x)sns.kdeplot(x, bw=.2, label="bw: 0.2")sns.kdeplot(x, bw=2, label="bw: 2")plt.legend();
如上所述,高斯KDE過程的性質意味著估計延續了數據集中最大和最小的值。 可以通過cut參數來控制繪製曲線的極值值的距離; 然而,這隻影響曲線的繪製方式,而不是曲線如何擬合:
sns.kdeplot(x, shade=True, cut=0)sns.rugplot(x);
擬合參數分布
還可以使用distplot()將參數分布擬合到數據集,並可視化地評估其與觀察數據的對應關係:
x = np.random.gamma(6, size=200)sns.distplot(x, kde=False, fit=stats.gamma);
繪製雙變數分布
在繪製兩個變數的雙變數分布也是有用的。在seaborn中這樣做的最簡單的方法就是在jointplot()函數中創建一個多面板數字,顯示兩個變數之間的雙變數(或聯合)關係以及每個變數的單變數(或邊際)分布和軸。
mean, cov = [0, 1], [(1, .5), (.5, 1)]data = np.random.multivariate_normal(mean, cov, 200)df = pd.DataFrame(data, columns=["x", "y"])
散點圖
雙變數分布的最熟悉的可視化方式無疑是散點圖,其中每個觀察結果以x和y值表示。這是兩個方面的地毯圖。可以使用matplotlib中的plt.scatter函數繪製散點圖,它也是jointplot()函數顯示的默認方式。
sns.jointplot(x="x", y="y", data=df);
HexBin圖
直方圖的雙變數類似物被稱為「hexbin」圖,因為它顯示了落在六邊形倉內的觀測數。該圖適用於較大的數據集。通過matplotlib plt.hexbin函數和jointplot()中的樣式可以實現。 它最好使用白色背景:
x, y = np.random.multivariate_normal(mean, cov, 1000).Twith sns.axes_style("white"): sns.jointplot(x=x, y=y, kind="hex", color="k");
核密度估計
使用上述內核密度估計程序可視化雙變數分布也是可行的。在seaborn中,這種圖用等高線圖顯示,可以在jointplot()中作為樣式傳入參數使用:
sns.jointplot(x="x", y="y", data=df, kind="kde");
還可以使用kdeplot()函數繪製二維核密度圖。這樣可以將這種繪圖繪製到一個特定的(可能已經存在的)matplotlib軸上,而jointplot()函數只能管理自己:
f, ax = plt.subplots(figsize=(6, 6))sns.kdeplot(df.x, df.y, ax=ax)sns.rugplot(df.x, color="g", ax=ax)sns.rugplot(df.y, vertical=True, ax=ax);
如果是希望更連續地顯示雙變數密度,您可以簡單地增加n_levels參數增加輪廓級數:
f, ax = plt.subplots(figsize=(6, 6))cmap = sns.cubehelix_palette(as_cmap=True, dark=0, light=1, reverse=True)sns.kdeplot(df.x, df.y, cmap=cmap, n_levels=60, shade=True);
jointplot()函數使用JointGrid來管理。為了獲得更多的靈活性,您可能需要直接使用JointGrid繪製圖形。jointplot()在繪製後返回JointGrid對象,您可以使用它來添加更多圖層或調整可視化的其他方面:
g = sns.jointplot(x="x", y="y", data=df, kind="kde", color="m")g.plot_joint(plt.scatter, c="w", s=30, linewidth_=1, marker="+")g.ax_joint.collections[0].set_alpha(0)g.set_axis_labels("$X$", "$Y$");
呈現數據集中成對的關係
要在數據集中繪製多個成對雙變數分布,可以使用pairplot()函數。這將創建一個軸的矩陣,並顯示DataFrame中每對列的關係。默認情況下,它也繪製每個變數在對角軸上的單變數:
iris = sns.load_dataset("iris")sns.pairplot(iris);
對於jointplot()和JointGrid之間的關係,pairplot()函數是建立在一個PairGrid對象上的,可以直接使用它來獲得更大的靈活性:
g = sns.PairGrid(iris)g.map_diag(sns.kdeplot)g.map_offdiag(sns.kdeplot, cmap="Blues_d", n_levels=6);
【第三章完】
【未禾原創,所有章節已經完結,其他章節請點擊跳轉】
Seaborn(sns)官方文檔學習筆記(第一章 藝術化的圖表控制) - 知乎專欄
Seaborn(sns)官方文檔學習筆記(第二章 斑駁陸離的調色板) - 知乎專欄
Seaborn(sns)官方文檔學習筆記(第三章 分布數據集的可視化) - 知乎專欄
Seaborn(sns)官方文檔學習筆記(第四章 線性關係的可視化) - 知乎專欄
Seaborn(sns)官方文檔學習筆記(第五章 分類數據的繪製) - 知乎專欄
Seaborn(sns)官方文檔學習筆記(第六章 繪製數據網格) - 知乎專欄
推薦閱讀:
※使用Matplotlib畫動態圖實例
※Python數據抓取與可視化實戰——網易雲課堂人工智慧與大數據板塊課程實戰
※基於matplotlib的2D/3D抽象網格和能量曲線繪製程序
※matplotlib.pyplot.imshow如何顯示灰度圖?
TAG:Python | Matplotlib | 数据可视化 |