分布圖主要用來展示某些現象或數據在地理空間、時間或其他維度上的分布情況。它可以清晰地反映出數據的空間位置、數量、密度等特征,幫助人們更好地理解數據的內在規律和相互關系。
目錄
單變量分布
變量關系組圖
雙變量關系
核密度估計
山脊分布圖
單變量分布
distplot() 函數是 Seaborn 庫中用于繪制單變量分布圖的一個非常有用的函數。值得注意的是,從 Seaborn 的較新版本(特別是從0.11.0版本開始)開始,distplot() 函數已經被標記為棄用(deprecated),并建議使用更具體和靈活的繪圖函數,如 histplot() 用于直方圖,kdeplot() 或 displot()用于更復雜的分布可視化。
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
sns.set(style="darkgrid")
# 創建一個2行2列的子圖,每個子圖的大小為8x8,不共享x軸和y軸
f, axes = plt.subplots(2, 2, figsize=(8, 8), sharex=False, sharey=False)
sns.despine(left=True)
# 創建一個隨機數生成器,種子為10
rs = np.random.RandomState(8)
# 生成一個包含1000個隨機數的數組
d = rs.normal(size=1000)
# 繪制簡單的直方圖,kde=False不繪制核密度估計圖,下列其他圖類似
sns.distplot(d, kde=False, color="r", ax=axes[0, 0])
# 使用seaborn庫繪制d的分布圖,不繪制直方圖,繪制rug圖,顏色為黃色,繪制在axes[0, 1]上
sns.distplot(d, hist=False, rug=True, color="y", ax=axes[1, 0])
# 使用seaborn庫繪制d的分布圖,不繪制直方圖,顏色為藍色,kde_kws參數設置陰影為True,繪制在axes[1, 0]上
sns.distplot(d, hist=False, color="b", kde_kws={"shade": True}, ax=axes[0, 1])
# 使用seaborn庫中的distplot函數繪制直方圖,參數d為數據,color為顏色,ax為坐標軸
sns.distplot(d, color="g", ax=axes[1, 1])
# 設置坐標軸的y軸刻度
plt.setp(axes, yticks=[])
plt.tight_layout()
變量關系組圖
pairplot是Seaborn庫中的一個強大且多功能的繪圖函數,它主要用于繪制數據集中所有可能的成對關系圖。這個函數通過生成一個網格圖,每個單元格展示一個變量對的分布圖(如散點圖、直方圖或核密度估計圖),非常適合于初步的數據探索和可視化。
- data:指定要繪制的數據集,通常是一個pandas的DataFrame對象。
- vars:可選參數,用于指定要繪制哪些變量的關系圖。如果不指定,則默認繪制數據集中所有數值型變量的關系圖。
- hue:可選參數,用于指定一個分類變量,根據該變量的不同值對數據進行分組展示。
- kind:控制非對角線上圖表類型的參數,可選"scatter"(散點圖)和"reg"(回歸圖)等。但需要注意的是,pairplot的kind參數可能不如其他Seaborn圖表那樣靈活,因為它主要關注于成對關系的展示。
- diag_kind:控制對角線上圖表類型的參數,可選"hist"(直方圖)和"kde"(核密度估計圖)等。
- markers:控制散點圖中數據點的標記類型,用于區分不同的數據點或組別。
df = sns.load_dataset("iris")
sns.pairplot(df)
可以控制指定位置的圖表類型,比如對角線使用核密度估計圖??
sns.pairplot(df, diag_kind="kde")
?也可以對數據進行分組展示
sns.pairplot(iris, hue="species")
雙變量關系
雙變量關系(Bivariate Relationship)是統計學和數據分析中的一個基本概念,它指的是兩個變量之間的關聯或相互作用。在這種關系中,一個變量的變化可能會影響到另一個變量的變化,但這并不意味著一個變量是另一個變量的原因。雙變量關系可以是線性的,也可以是非線性的,它可以是正相關、負相關,或者根本沒有明確的關聯,即零相關。
jointplot是Seaborn庫中的一個強大工具,用于可視化兩個變量的聯合分布及其關系。它結合了多種圖表類型,如散點圖、直方圖、核密度估計圖(KDE)等,提供了對數據分布和關系的深入理解。jointplot能夠同時展示兩個變量的聯合分布以及它們各自的邊緣分布,從而幫助用戶全面理解變量之間的關系和分布情況。
- x, y:指定要繪制的兩個變量,分別作為x軸和y軸的數據。
- data:包含x和y變量的數據集,通常是一個pandas的DataFrame對象。
- kind:指定繪制圖表的類型,如
'scatter'
(散點圖)、'kde'
(核密度估計圖)、'hex'
(蜂窩圖)等。 - color:設置圖表中元素的顏色。
- size:設置圖表的大小(正方形)。
- ratio:設置中心圖與側邊圖的比例。
- joint_kws, marginal_kws:分別用于自定義聯合圖和邊緣圖的樣式。
# 創建一個隨機數生成器,種子為8
rs = np.random.RandomState(8)
# 生成1000個服從Gamma分布的隨機數
x = rs.gamma(8, size=1000)
# 生成1000個服從正態分布的隨機數,并乘以-0.5
y = -.5 * x + rs.normal(size=1000)
# x和y為數據,kind參數指定圖形類型為六邊形,color參數指定顏色為紅色
sns.jointplot(x=x, y=y, kind="hex", color="r")
# 加載tips數據集
tips = sns.load_dataset("tips")
# ,x軸為total_bill,y軸為tip,數據為tips,類型為線性回歸,x軸范圍為0到50,y軸范圍為0到12,顏色為綠色,高度為6
g = sns.jointplot(x="total_bill", y="tip", data=tips, kind="reg",xlim=(0, 50), ylim=(0, 12), color="g", height=6)
?
核密度估計
核密度估計(Kernel Density Estimation, KDE)是一種在概率論中用來估計未知的密度函數的非參數檢驗方法,由Rosenblatt(1955)和Emanuel Parzen(1962)提出,又稱為Parzen窗(Parzen window)。核密度估計的基本思想是,對于給定的數據樣本,通過核函數(通常是對稱且非負的密度函數,如高斯函數)來擬合數據點的局部密度,進而估計整個數據的密度函數。具體來說,對于數據集中的每一個點,都以其為中心放置一個核函數,然后對所有核函數進行加權平均(或求和),得到的結果即為整個數據集的密度估計。
# 設置繪圖風格為暗色
sns.set(style="dark")
# 創建一個隨機數生成器,種子為8
rs = np.random.RandomState(8)
# 生成隨機數的數組
x, y = rs.randn(2, 1000)
# 繪制x和y的核密度估計圖
sns.kdeplot(x=x, y=y,color="r")
# 調整布局,使圖形更加緊湊
f.tight_layout()
# 設置繪圖風格為darkgrid
sns.set(style="darkgrid")
# 加載iris數據集
iris = sns.load_dataset("iris")
# 查詢出species為setosa的數據
setosa = iris.query("species == 'setosa'")
# 查詢出species為virginica的數據
virginica = iris.query("species == 'virginica'")
# 創建一個8x8的繪圖區域
f, ax = plt.subplots(figsize=(8, 8))
# 設置繪圖區域的縱橫比為1:1
ax.set_aspect("equal")
# 繪制setosa數據的密度圖,使用Blues顏色映射,并設置陰影和最低值陰影
ax = sns.kdeplot(x=setosa.sepal_width, y=setosa.sepal_length,cmap="Blues", shade=True, shade_lowest=False)
# 繪制virginica數據的密度圖,使用Reds顏色映射,并設置陰影和最低值陰影
ax = sns.kdeplot(x=virginica.sepal_width, y=virginica.sepal_length,cmap="Reds", shade=True, shade_lowest=False)
# 獲取Reds顏色映射的倒數第二個顏色
red = sns.color_palette("Reds")[-2]
# 獲取Blues顏色映射的倒數第二個顏色
blue = sns.color_palette("Blues")[-2]
# 在繪圖區域中添加文本,顯示species為virginica的數據
ax.text(2.5, 8.2, "virginica", size=16, color=blue)
# 在繪圖區域中添加文本,顯示species為setosa的數據
ax.text(3.8, 4.5, "setosa", size=16, color=red)
山脊分布圖
山脊分布圖,也稱為山脊圖(Ridge Plot)或Joy Plot,是一種數據可視化的方法,主要用于展示一個或多個組的數據分布情況。山脊圖通過平滑的密度曲線來表示每個組的數據分布,這些曲線沿垂直軸堆疊排列,形成類似山脊的視覺效果。制作基于核密度估計(Kernel Density Estimation, KDE),這是一種估計概率密度函數的非參數方式。通過KDE,可以對每個組的數據進行平滑處理,從而得到連續的密度曲線。
# 創建一個隨機數生成器,種子為8
rs = np.random.RandomState(8)
# 生成500個隨機數
x = rs.randn(500)
# 創建一個字符串,重復50次
g = np.tile(list("ABCDEFGHIJ"), 50)
# 創建一個DataFrame,包含x和g兩列
df = pd.DataFrame(dict(x=x, g=g))
# 將g列中的字符轉換為ASCII碼
m = df.g.map(ord)
# 將m加到x列上
df["x"] += m
# 創建一個顏色調色板
pal = sns.cubehelix_palette(10, rot=-.5, light=.7)
# 創建一個FacetGrid,按g列進行分面,hue參數設置為g,aspect參數設置為15,height參數設置為0.5,palette參數設置為pal
g = sns.FacetGrid(df, row="g", hue="g", aspect=15, height=.5, palette=pal)
# 在每個分面上繪制核密度圖,clip_on參數設置為False,shade參數設置為True,alpha參數設置為1,lw參數設置為1.5,bw參數設置為0.2
g.map(sns.kdeplot, "x", clip_on=False, shade=True, alpha=1, lw=1.5, bw=.2)
# 在每個分面上繪制核密度圖,clip_on參數設置為False,color參數設置為白色,lw參數設置為2,bw參數設置為0.2
g.map(sns.kdeplot, "x", clip_on=False, color="w", lw=2, bw=.2)
# 在每個分面上繪制水平線,y參數設置為0,lw參數設置為2,clip_on參數設置為False
g.map(plt.axhline, y=0, lw=2, clip_on=False)
# 定義一個函數,用于在每個分面上添加標簽
def label(x, color, label):# 獲取當前的坐標軸ax = plt.gca()# 在坐標軸上添加文本,字體加粗,顏色為color,文本內容為label,水平對齊方式為左對齊,垂直對齊方式為居中對齊,坐標軸變換為ax.transAxesax.text(0, .2, label, fontweight="bold", color=color,ha="left", va="center", transform=ax.transAxes)
# 在每個分面上調用label函數
g.map(label, "x")
# 調整子圖之間的間距
g.fig.subplots_adjust(hspace=-.5)
# 設置標題為空
g.set_titles("")
# 設置y軸刻度為空
g.set(yticks=[])
# 去掉底部和左邊的邊框
g.despine(bottom=True, left=True)