Python 數據科學中的 Seaborn 繪圖可視化
Python中文社區 (ID:python-china)
本篇文章主要研究 Seaborn 庫——Seaborn 是一個統計繪圖庫,建立在 Matplotlib 基礎之上。它具有非常漂亮的默認繪圖樣式,并且也與 Pandas DataFrames 配合得很好。
Seaborn 可以像安裝任何其他 Python 包一樣使用“pip”進行安裝。
- pip install seaborn
Seaborn 的官方文檔地址如下:
https://seaborn.pydata.org/
另一個重要的地址是官方 API,它引用了各種可用的繪圖類型。
https://seaborn.pydata.org/api.html
我將嘗試將 Seaborn 的功能分解為不同的類別——并從使我們能夠可視化數據集分布的圖開始。
讓我們從導入開始并加載數據 - 我將使用“Financial Sample.xlsx”數據。excel文件可以長按掃碼文末二維碼后進入寬客量化俱樂部下載:
Financial Sample.xlsx
- import pandas as pd
- import seaborn as sns
- #如果使用 Jupyter Notebooks,下面的行允許我們在瀏覽器中顯示圖表
- %matplotlib inline
- #在 Pandas DataFrame 中加載我們的數據
- df = pd.read_excel('Financial Sample.xlsx')
- #打印前 5 行數據以確保正確加載
- df.head()
讓我們首先看看“distplot”——這讓我們可以看到一組單變量觀測值的分布——單變量只是意味著一個變量。
- #繪制 DataFrame "Profit" 列的分布
- sns.displot(df['Profit'])
我們現在有一個感興趣的分布圖——但作為一個快速入門,風格看起來有點平淡。讓我們給它一個更常見的“Seaborn”樣式,試圖讓它看起來更好一點……
- #設置我們希望用于繪圖的樣式
- sns.set_style("darkgrid")
- #繪制 DataFrame "Profit" 列的分布
- sns.displot(df['Profit'])
我們已經設法用一行代碼繪制 DataFrame 數據的直方圖以及“KDE”線——即核密度估計圖。如果我們在 plot 調用中添加“kde=False”,我們可以刪除 KDE。我們還可以按如下方式更改直方圖中“bins”的數量——在本例中,它們被設置為 50:
- sns.displot(df['Profit'],kde=False,bins=50)
現在讓我們看一個“聯合圖”——這允許我們組合兩個 distplots 并處理雙變量數據。讓我們創建一個快速的聯合圖。為此,我們需要通過傳入列名來指定我們想要繪制的 DataFrame 列,以及我們從中提取列的實際 DataFrame。這可以按如下方式完成:假設我想繪制“Profit”列與“Units Sold”列。
- sns.jointplot(x='Profit',y='Units Sold',data=df)
我們現在有一個圖,顯示了兩個變量列之間的散點圖,以及它們在任一側的相應分布圖(它甚至在右上角為我們提供了皮爾遜相關系數和 p 分數。)
Jointplot 還允許我們設置一個名為“kind”的附加參數。這允許您影響主圖表的表示方式。目前它是一個“散點”,因為這是默認值,但是如果我們將其更改為“十六進制”,例如,我們將得到以下圖,它將圖表上的點表示為密度六邊形 - 即包含更多數據點的六邊形 顯示為比包含較少點的那些更暗。
- sns.jointplot(x='Profit',y='Units Sold',data=df,kind='hex')
我們可以為“kind”添加的另一個參數是“reg”,它代表回歸。這看起來很像散點圖,但這次將添加線性回歸線。
- sns.jointplot(x='Profit',y='Units Sold',data=df,kind='reg')
我們可以規定的另一種類型是“kde”,它將繪制一個二維 KDE 圖,它基本上只顯示數據點最常出現的位置的密度。
- sns.jointplot(x='Profit',y='Units Sold',data=df,kind='kde')
讓我們從jointplots繼續看“pairplots”。這些使我們能夠查看整個數據幀(對于數值數據)的成對關系,并且還支持分類數據點的“色調”參數。所以 pairplot 本質上是為 DataFrame 中數字列的每個可能組合創建一個聯合圖。我將快速創建一個新的 DataFrame,它刪除“Month Number”和“Year”列,因為這些并不是我們連續數字數據的一部分,例如“利潤”和“COGS”(銷售成本)。我還將刪除其他幾列以縮小我們的 DataFrame,這樣我們的輸出圖就不會過于擁擠。
- #刪除不需要的列
- new_df = df.drop(['Month Number','Year','Manufacturing Price','Sale Price'],axis=1)
- sns.pairplot(new_df)
請注意,我們基本上對每對列都有一個配對圖,并且在對角線上我們有一個分布的直方圖,因為將數據與自身進行聯合圖是沒有意義的。這是快速可視化數據的好方法。我們還可以添加一個“色調”——這是我們指定一個用于分割數據的分類變量的地方。讓我們添加“Segment”列作為我們的“色調”。
- sns.pairplot(new_df,hue='Segment')
現在數據點根據分類數據著色——顏色圖例顯示在圖的右側邊緣。我們還可以通過設置“調色板”參數來更改繪圖使用的調色板。以下是使用“巖漿”配色方案的示例。所有可用的方案都可以在 Matplotlib 站點上找到。
- sns.pairplot(new_df,hue='Segment',palette='magma')
我們將看到的下一個圖是一個“rugplot”——這將幫助我們構建和解釋我們之前創建的“kde”圖是什么——無論是在我們的 distplot 中還是當我們傳遞“kind=kde”作為我們的參數時。
- sns.rugplot(df['Profit'])
如上所示,對于 rugplot,我們將要繪制的列作為參數傳遞 - rugplot 的作用是為分布中的每個點繪制一個破折號。所以 rugplot 和 distplot 之間的區別在于 distplot 涉及“bins”的概念,并將把每個 bin 中的所有數據點相加,并繪制這個數字,而 rugplot 只是在每個數據點繪制一個標記。
所以現在讓我們將 rugplot 轉換為 KDE 圖。KDE 代表“核密度估計”。下圖是解釋如何將 rugplots 構建到 KDE 圖中的。
如果我們愿意的話,我們可以從一組數據和 rugplot 中構建我們自己的 KDE 圖,看看它是否與使用內置的“kdeplot”直接創建的 KDE 圖相匹配.
- #設置一組 30 個取自正態分布的數據點
- x = np.random.normal(0, 1, size=30)
- #設置 KDE 點的帶寬
- bandwidth = 1.06* x.std() * x.size ** (-1/ 5.)
- #設置 y 軸的限制
- 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)
- #使用復合梯形規則沿給定軸積分并創建 KDE 圖
- from scipy.integrate import trapz
- density = np.sum(kernels, axis=0)
- density /= trapz(density, support)
- plt.plot(support, density)
現在讓我們使用內置的“kdeplot”繪制 KDE 圖。
- sns.kdeplot(x, shade=True)
我們可以看到兩個圖是相同的,我們已經正確地創建了我們的 KDE 圖。本文已經涵蓋了大部分分布圖功能。