目錄
條形圖
箱形圖
散點圖
分簇散點圖
小提琴
分簇小提琴
條形圖
條形圖是一種直觀的圖表形式,它通過不同長度的矩形條(即“條形”)來展示數值變量的中心趨勢估計值,其中每個矩形的高度直接對應于該組數據的某個中心量度(如均值、中位數等)。此外,為了向觀眾傳達關于這些中心趨勢估計值可靠性的額外信息,條形圖上常附有誤差線。這些誤差線提供了關于估計值周圍不確定性的視覺指示,幫助理解數據的變異性或抽樣誤差可能如何影響這些中心趨勢的估計。
也可以表示標準誤差(Standard Error, SE)、置信區間(Confidence Interval, CI)或其他統計度量,它們均反映了估計值的不確定性范圍。例如,一個95%的置信區間誤差線會展示一個范圍,該范圍在多次重復相同研究的情況下,有95%的機會包含真實的中心趨勢值。這樣的表示不僅展示了數據的中心位置,還通過誤差線直觀地揭示了圍繞這一中心位置的不確定性程度。
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
crashes = sns.load_dataset("car_crashes").sort_values("total", ascending=False)
# 初始化畫布大小
f, ax = plt.subplots(figsize=(15, 15))
# 繪出總的交通事故
sns.set_color_codes("pastel")
# 繪制條形圖,x軸為alcohol,y軸為abbrev,數據為crashes,標簽為Total,顏色為r
sns.barplot(x="total", y="abbrev", data=crashes, label="Total", color="r")
# 設置顏色代碼
sns.set_color_codes("bright")
# 繪制條形圖,x軸為alcohol,y軸為abbrev,數據為crashes,標簽為Alcohol-involved,顏色為r
sns.barplot(x="alcohol", y="abbrev", data=crashes, label="Alcohol-involved", color="r")
# 設置圖例,每行2列,位置在右下角,邊框顯示
ax.legend(ncol=2, loc="lower right", frameon=True)
# 設置x軸范圍,y軸標簽為空,x軸標簽為“Automobile collisions per billion miles”
ax.set(xlim=(0, 24), ylabel="",xlabel="Automobile collisions per billion miles")
箱形圖
箱形圖,亦稱為盒須圖、盒式圖或箱線圖,是一種在統計學和數據可視化領域廣泛應用的圖形工具,用于直觀地展示和比較一組或多組數據的分布特征。通過緊湊而富有信息量的方式,將數據的最大值、最小值、中位數、以及上四分位數和下四分位數等重要統計量呈現在簡潔的圖形之中。廣泛應用于各種領域,如質量控制、經濟學、生物學、醫學研究等,幫助研究人員和分析師快速識別數據中的模式、異常值和分布特征,為進一步的統計分析和決策制定提供有力支持。
-
中位數(Median):箱形圖中的中心線代表數據集的中位數,即將數據集排序后位于中間的數值,反映了數據的中心趨勢。
-
四分位數(Quartiles):
- 下四分位數(Q1):位于數據集25%處的數值,即至少有25%的數據小于或等于這個值。
- 上四分位數(Q3):位于數據集75%處的數值,即至少有75%的數據小于或等于這個值。
四分位數與中位數一起,將數據集分為四個等量的部分,反映了數據的分布范圍。
-
箱體(Box):由下四分位數和上四分位數構成的矩形區域,表示數據的主要集中范圍。箱體的高度反映了數據的中間50%的離散程度。
-
須(Whiskers):從箱體的上下兩端延伸出的線段,通常表示數據的最小值和最大值(或根據特定規則調整后的值,如使用1.5倍四分位距來排除異常值)。須的長度顯示了數據分布的極端值范圍。
-
異常值(Outliers):通常定義為超出須范圍的數據點,以單獨的點或符號表示,它們可能由于測量錯誤、數據錄入錯誤或極端事件而產生。
# 加載tips數據集
tips = sns.load_dataset("tips")
# 繪制嵌套的箱線圖,按日期和時間顯示賬單
# x軸為日期,y軸為賬單,hue為是否吸煙,顏色分別為m和g
sns.boxplot(x="day", y="total_bill", hue="smoker", palette=["r", "b"], data=tips)
# 去除圖表的邊框,偏移量為10,去除多余的邊框
sns.despine(offset=10, trim=True)
散點圖
點圖作為一種數據可視化工具,核心在于展示數值變量在不同分類級別上的中心趨勢估計。通過點的位置,能夠直觀地把握各分類下的數值分布情況。此外,點圖還巧妙地運用誤差線來標示這些中心趨勢估計的不確定性范圍,提供了更為全面的數據解讀視角。與條形圖相比,點圖在聚焦于分類變量不同級別之間的比較時往往更具優勢。它們不僅能夠清晰地展示各分類下的數值水平,還能夠在有限的空間內容納更多的信息點,適合于展示較為復雜的數據集。
點圖在展現交互作用方面表現出色。它們能夠直觀地揭示一個分類變量的各個層次如何隨著第二個分類變量的變化而變化,這種變化關系通過點圖中點的位置及其連線得以生動展現。特別是當使用不同色調來區分不同組別時,連接相同色調等級點的線條能夠清晰地顯示出斜率的變化,從而更容易地捕捉到不同組別間交互作用的微妙差異。
import pandas as pd
import seaborn as sns
# 設置圖形風格
sns.set(style="ticks")
# 加載iris數據集
iris = sns.load_dataset("iris")
# 將數據格式調整
iris = pd.melt(iris, "species", var_name="measurement")
# 初始化圖形
f, ax = plt.subplots()
# 移除圖形的底部和左側的邊框
sns.despine(bottom=True, left=True)
# 繪制條形圖
# 使用seaborn庫中的stripplot函數繪制散點圖
# x參數指定x軸的數據,y參數指定y軸的數據,hue參數指定顏色映射,data參數指定數據集
# dodge參數指定是否在x軸上分散,jitter參數指定是否在y軸上抖動,alpha參數指定透明度,zorder參數指定繪圖順序
sns.stripplot(x="value", y="measurement", hue="species",data=iris, dodge=True, jitter=True,alpha=.5, zorder=1)
# 顯示條件平均數
# 使用seaborn庫中的pointplot函數繪制點圖
# x參數指定x軸的數據,y參數指定y軸的數據,hue參數指定顏色映射,data參數指定數據集
# dodge參數指定點之間的間隔,join參數指定是否連接點,palette參數指定顏色調色板
# markers參數指定點的形狀,scale參數指定點的大小,ci參數指定置信區間
sns.pointplot(x="value", y="measurement", hue="species",data=iris, dodge=.532, join=False, palette="dark",markers="s", scale=1, ci=True)
# 圖例設置
handles, labels = ax.get_legend_handles_labels()
# 設置圖例的位置和樣式
# 添加圖例,handles為圖例的句柄,labels為圖例的標簽,title為圖例的標題
# handletextpad為圖例文本與句柄之間的距離,columnspacing為圖例列之間的距離
# loc為圖例的位置,ncol為圖例的列數,frameon為是否顯示圖例的邊框
ax.legend(handles[3:], labels[3:], title="species",handletextpad=0.05, columnspacing=0.05,loc="upper left", ncol=1, frameon=True)
分簇散點圖
分簇散點圖Swarmplot,是一種用于展示分類變量和數值變量之間關系的數據可視化圖表類型,特別適用于探索多個分類級別下數據的分布情況,簡單說就是數據點不重疊的分類散點圖swarmplot()作為可視化的工具,不僅能夠單獨使用來展現數據的分類特征,還常作為箱形圖(Boxplot)或小提琴圖(Violin Plot)的補充手段。箱形圖雖然能概括數據的四分位數范圍,但無法展示所有具體數據點;小提琴圖則通過密度估計展示了數據分布的形狀,但在數據點較少時可能不夠直觀。而Swarmplot則巧妙地填補了這一空白,它直接展示所有數據點,同時通過其獨特的布局方式保留了數據的基本分布特征,使得用戶能夠同時獲得宏觀與微觀的數據洞察。
import pandas as pd
import seaborn as sns
# 設置繪圖風格和調色板
sns.set(style="whitegrid", palette="bright")
# 加載數據集
iris = sns.load_dataset("iris")
# 處理數據集,將species列作為索引,var_name為measurement
iris = pd.melt(iris, "species", var_name="measurement")
# 繪制分類散點圖,x軸為measurement,y軸為value,hue為species,調色板為b、c、y
sns.swarmplot(x="measurement", y="value", hue="species", palette=["b", "c", "y"], data=iris)
小提琴
小提琴圖(Violin Plot)是一種高級的數據可視化工具,它巧妙地展示了定量數據在單個或多個分類變量不同層級上的分布情況,并允許對這些分布進行直觀的比較。與箱形圖(Box-plot)不同,小提琴圖不僅僅依賴于幾個關鍵統計量(如中位數、四分位數)來描繪數據分布,而是采用了更為細膩的方法——核密度估計(Kernel Density Estimation, KDE),來描繪數據的潛在分布形態。
核密度估計是一種非參數方法,用于估計隨機變量的概率密度函數。在小提琴圖中,這一技術被用來繪制每個分類層級下數據的“密度輪廓”,即數據點在不同值域上的相對頻率或概率分布。這種表示方式不僅展示了數據的中心趨勢(如中位數附近的密集區域),還揭示了數據的整體形狀、對稱性、多峰性以及可能的異常值區域,從而提供了比箱形圖更為豐富和細致的數據分布信息。
小提琴圖的優勢在于其能夠同時展示數據的分布形態和密度信息,使得觀察者能夠更全面地理解數據在不同分類層級下的變異性和相似性。此外,小提琴圖還常常與箱形圖結合使用,即在每個小提琴圖內部繪制對應的箱形圖組件(如中位數線、四分位數范圍等),以提供額外的統計量參考和異常值標識。
import numpy as np
import seaborn as sns
# 生成模擬數據集
# 創建一個隨機數生成器,種子為0
rs = np.random.RandomState(0)
# 定義樣本數量和特征數量
n, p = 40, 8
# 生成一個40行8列的隨機正態分布矩陣,均值為0,標準差為2
d = rs.normal(0, 2, (n, p))
# 對矩陣中的每個元素進行操作,加上-5乘以特征索引再加10
d += np.log(np.arange(1, p + 1)) * -5 + 10
# 使用cubehelix獲得自定義的順序調色板
pal = sns.cubehelix_palette(p, rot=-.8, dark=.6)
# 使用小提琴圖和圓點展現每種分布
sns.violinplot(data=d, palette=pal, inner="point")
分簇小提琴
分簇小提琴圖(Clustered Violin Plot)是一種特殊的小提琴圖變種,它結合了小提琴圖的分布展示能力與分簇圖的比較功能,用于在同一圖表中比較多個組別或分類變量下的數據分布情況。其通過并排展示多個小提琴圖(每個小提琴代表一個組別或類別),來同時比較不同組別下定量數據的分布形態和密度。每個小提琴的內部結構與標準小提琴圖相同,包括核密度估計曲線、可能的箱線圖元素(如中位數、四分位數等),以及表示數據密度的寬度變化。
# 導入seaborn庫
import seaborn as sns
# 加載tips數據集
tips = sns.load_dataset("tips")
# 繪制一個嵌套的小提琴圖,并拆分小提琴以便于比較
# 使用seaborn庫繪制小提琴圖
# x軸為day,y軸為total_bill,根據smoker進行分組
# split參數為True,表示將不同組的數據分開繪制
# inner參數為"quart",表示在小提琴內部繪制四分位數
# palette參數為字典,表示不同組的數據使用不同的顏色
# data參數為tips,表示使用tips數據集
sns.violinplot(x="day", y="total_bill", hue="smoker",split=True, inner="quart",palette={"Yes": "g", "No": "y"},data=tips)
# 去除左邊框
sns.despine(left=True)