4.1 类别散点图 第四章:Seaborn 分类图 (Categorical Plots) - 4.1 类别散点图:深入探索数据分布的利器 引言 在数据可视化领域,Seaborn 库以其强大的统计图形绘制能力和美观的默认样式,成为了 Python 数据科学工具箱中不可或缺的一部分。Seaborn 构建于 Matplotlib 之上,提供了更高级别的接口,使得创建信息丰富且具有吸引力的统计图表变得更加容易。 当我们处理包含类别变量的数据集时,理解不同类别下数据点的分布情况至关重要。Seaborn 的分类图 (Categorical Plots) 模块正是为此而生,它提供了一系列强大的工具,帮助我们有效地可视化和分析类别数据。
第四章:Seaborn 分类图 (Categorical Plots) - 4.1 类别散点图:深入探索数据分布的利器
引言
在数据可视化领域,Seaborn 库以其强大的统计图形绘制能力和美观的默认样式,成为了 Python 数据科学工具箱中不可或缺的一部分。Seaborn 构建于 Matplotlib 之上,提供了更高级别的接口,使得创建信息丰富且具有吸引力的统计图表变得更加容易。
当我们处理包含类别变量的数据集时,理解不同类别下数据点的分布情况至关重要。Seaborn 的分类图 (Categorical Plots) 模块正是为此而生,它提供了一系列强大的工具,帮助我们有效地可视化和分析类别数据。
在本章中,我们将聚焦于分类图中的第一类:类别散点图 (Categorical Scatter Plots)。类别散点图旨在展示一个或多个类别变量与一个数值变量之间的关系,并通过散点的方式直观地展现数据点在不同类别中的分布情况。Seaborn 提供了两种主要的类别散点图函数:stripplot() 和 swarmplot(),它们各有特点,适用于不同的数据分析场景。
4.1.1 stripplot():一维散点图的类别视角
stripplot() 函数是 Seaborn 中最基础的类别散点图函数,它本质上是一种一维的散点图,沿着分类轴(通常是 x 轴)展示每个类别的数据分布情况。stripplot() 的主要特点在于它能够清晰地展示每个类别下数据点的实际位置,但当数据点密度较高时,可能会出现重叠,导致某些数据点被遮盖。
基本用法
stripplot() 函数的基本语法结构如下:
seaborn.stripplot(x=None, y=None, hue=None, data=None, order=None, hue_order=None, jitter=True, dodge=False, orient=None, color=None, palette=None, size=5, edgecolor='gray', linewidth=0, marker='o', alpha=None, ax=None, **kwargs)
让我们逐一解释一些关键参数:
x:指定 x 轴的变量名,通常是类别变量。
y:指定 y 轴的变量名,通常是数值变量。
hue:指定第三个类别变量,用于在同一图中根据 hue 变量的不同类别进行颜色区分。
data:指定输入的数据集,通常是一个 Pandas DataFrame。
jitter:控制数据点在类别轴上的抖动程度,用于减少数据点重叠,默认为 True。
order:指定类别轴上类别的顺序。
hue_order:指定 hue 变量类别的顺序。
color:指定所有数据点的颜色。
palette:指定调色板,用于根据 hue 变量的不同类别设置不同的颜色。
size:控制数据点的大小。
marker:指定数据点的形状,例如 'o' (圆形), 's' (正方形), '^' (三角形) 等。
alpha:控制数据点的透明度。
ax:指定要绘制图形的 Matplotlib axes 对象。
代码实践 1:基本 stripplot()
我们使用 Seaborn 内置的 tips 数据集来演示 stripplot() 的基本用法。tips 数据集包含了餐厅顾客的小费信息,其中 'day' 列是类别变量,'total_bill' 列是数值变量。
import seaborn as sns import matplotlib.pyplot as plt # 加载 tips 数据集 tips = sns.load_dataset("tips") # 绘制基本的 stripplot sns.stripplot(x="day", y="total_bill", data=tips) plt.title("Basic Stripplot of Total Bill by Day") plt.show()
这段代码将生成一个简单的 stripplot,x 轴表示星期几(day),y 轴表示总账单金额(total_bill)。图中每个点代表一笔账单,横坐标表示账单发生的星期几,纵坐标表示账单金额。我们可以直观地看到每天的总账单金额分布情况。
Mermaid 图表 1:基本 stripplot 原理
这个 Mermaid 图表简单地描述了基本 stripplot() 的工作流程:从数据集开始,经过 stripplot() 函数处理,指定 x 和 y 轴变量,最终绘制出展示每天账单金额分布的散点图。
代码实践 2:使用 hue 参数添加第三个类别变量
我们可以使用 hue 参数添加第三个类别变量,例如 'sex' (性别),来进一步分析不同性别顾客在不同星期的消费习惯。
sns.stripplot(x="day", y="total_bill", hue="sex", data=tips) plt.title("Stripplot with Hue for Sex") plt.show()
在这个例子中,我们添加了 hue="sex" 参数,stripplot() 会根据顾客性别(sex)用不同的颜色区分数据点。这样我们就可以同时观察不同性别顾客在不同星期的总账单金额分布情况,并比较男女顾客的消费差异。
Mermaid 图表 2:带有 hue 参数的 stripplot 原理
这个 Mermaid 图表在之前的基础上增加了 hue 变量的处理流程,展示了 stripplot() 如何根据 hue 变量对数据点进行颜色编码,从而展示更丰富的信息。
代码实践 3:定制 stripplot() 的外观
stripplot() 提供了丰富的参数来定制图形的外观,例如调整抖动程度、数据点大小、颜色、形状等。
sns.stripplot(x="day", y="total_bill", data=tips, jitter=0.05, # 减少抖动 size=8, # 增大点的大小 marker="D", # 使用菱形标记 color="skyblue", # 设置统一颜色 alpha=0.7) # 设置透明度 plt.title("Customized Stripplot") plt.show()
在这个例子中,我们通过 jitter 参数减少了数据点的抖动程度,通过 size 参数增大了数据点的大小,通过 marker 参数将数据点形状改为菱形,通过 color 参数设置了统一的浅蓝色,并通过 alpha 参数增加了透明度。这些定制参数可以帮助我们根据具体需求调整图形的视觉效果,使其更加清晰易懂。
stripplot() 的优缺点
优点:
简单直观: stripplot() 能够清晰地展示每个类别下数据点的实际分布情况,易于理解。
适用性广: 适用于各种类别变量和数值变量的组合。
易于定制: 提供了丰富的参数来定制图形的外观。
缺点:
数据重叠: 当数据点密度较高时,容易出现重叠,导致某些数据点被遮盖,难以准确观察数据分布的细节。
不展示分布形状: stripplot() 仅展示数据点的实际位置,无法直接展示数据分布的形状,例如分布是集中还是分散,是否对称等。
4.1.2 swarmplot():避免重叠的蜂群散点图
为了解决 stripplot() 在数据点密度较高时容易重叠的问题,Seaborn 提供了 swarmplot() 函数。swarmplot() 也被称为“蜂群图”或“小提琴散点图”,它与 stripplot() 类似,也是一种类别散点图,但其核心区别在于 swarmplot() 使用了一种避免数据点重叠的算法。当数据点密度较高时,swarmplot() 会自动调整数据点的位置,使得每个数据点都能够被清晰地展示出来,从而更准确地反映数据的分布情况。
基本用法
swarmplot() 函数的语法结构与 stripplot() 非常相似:
seaborn.swarmplot(x=None, y=None, hue=None, data=None, order=None, hue_order=None, dodge=False, orient=None, color=None, palette=None, size=5, edgecolor='gray', linewidth=0, marker='o', alpha=None, ax=None, **kwargs)
可以看到,swarmplot() 的参数与 stripplot() 基本一致,主要的区别在于 swarmplot() 没有 jitter 参数,因为它本身就旨在避免数据点重叠。
代码实践 4:基本 swarmplot()
我们继续使用 tips 数据集来演示 swarmplot() 的基本用法。
sns.swarmplot(x="day", y="total_bill", data=tips) plt.title("Basic Swarmplot of Total Bill by Day") plt.show()
这段代码将生成一个基本的 swarmplot,与之前的 stripplot 相比,我们可以看到,当同一类别下数据点较多时,swarmplot() 会自动调整数据点的位置,避免重叠,使得每个数据点都清晰可见。
Mermaid 图表 3:基本 swarmplot 原理
这个 Mermaid 图表与 stripplot 的图表类似,但强调了 swarmplot() 的核心特性:避免数据点重叠,更清晰地展示数据分布。
代码实践 5:使用 hue 参数的 swarmplot()
同样,我们也可以使用 hue 参数在 swarmplot() 中添加第三个类别变量。
sns.swarmplot(x="day", y="total_bill", hue="sex", data=tips) plt.title("Swarmplot with Hue for Sex") plt.show()
与 stripplot 类似,通过添加 hue="sex",swarmplot() 会根据性别对数据点进行颜色区分,并避免同一类别和同一性别的数据点重叠。
Mermaid 图表 4:带有 hue 参数的 swarmplot 原理
这个 Mermaid 图表与带有 hue 参数的 stripplot 图表类似,但再次强调了 swarmplot() 的避免重叠特性。
代码实践 6:定制 swarmplot() 的外观
swarmplot() 也支持各种外观定制参数,例如调整点的大小、颜色、形状等。
sns.swarmplot(x="day", y="total_bill", data=tips, size=6, # 减小点的大小 marker="o", # 使用圆形标记 palette="muted", # 使用 muted 调色板 alpha=0.8) # 设置透明度 plt.title("Customized Swarmplot") plt.show()
在这个例子中,我们通过 size 参数减小了数据点的大小,通过 marker 参数保持圆形标记,通过 palette 参数使用了 "muted" 调色板,并通过 alpha 参数设置了透明度。
swarmplot() 的优缺点
优点:
避免重叠: 能够有效地避免数据点重叠,即使在高密度数据情况下也能清晰展示所有数据点。
展示分布形状: 虽然不是直接展示分布形状,但通过避免重叠,swarmplot() 能够更好地展现数据在类别内的分布范围和密度,间接地反映分布形状。
适用性广: 适用于各种类别变量和数值变量的组合。
易于定制: 提供了丰富的参数来定制图形的外观。
缺点:
计算成本较高: 为了避免重叠,swarmplot() 需要进行额外的计算,当数据量非常大时,绘制速度可能会比 stripplot() 慢。
可能扭曲真实分布: 为了避免重叠,swarmplot() 可能会稍微调整数据点的真实位置,在某些情况下可能会轻微扭曲数据的真实分布情况。
4.1.3 stripplot() vs. swarmplot():如何选择?
stripplot() 和 swarmplot() 都是强大的类别散点图工具,它们的主要区别在于如何处理数据点重叠。那么,在实际应用中,我们应该如何选择使用哪个函数呢?
选择原则:
数据量和密度:
当数据量较小,数据点密度不高时,stripplot() 和 swarmplot() 的效果差异不大,都可以使用。stripplot() 可能更轻量级,绘制速度更快。
当数据量较大,数据点密度较高时,swarmplot() 更适合,因为它能够避免数据点重叠,更清晰地展示数据分布。
关注点:
如果你更关注每个数据点的实际位置,并且对少量数据点重叠可以接受,stripplot() 是一个不错的选择。
如果你更关注数据的整体分布形状,并且希望避免任何数据点重叠,swarmplot() 是更好的选择。
计算性能:
stripplot() 可能更具优势,因为它计算成本较低。总结:
stripplot(): 快速、简单,适用于数据量较小或对重叠容忍度较高的情况。
swarmplot(): 避免重叠,更清晰地展示数据分布,适用于数据量较大或需要精确观察分布形状的情况。
在实际应用中,您可以根据具体的数据特点和分析目标,灵活选择 stripplot() 或 swarmplot(),或者结合使用两者,从不同角度探索数据。
4.1.4 进一步定制:结合 Matplotlib
Seaborn 图形是构建在 Matplotlib 之上的,因此我们可以利用 Matplotlib 的强大定制能力,进一步美化和完善我们的类别散点图。例如,我们可以添加标题、修改轴标签、调整颜色方案、添加网格线、添加图例等等。
代码实践 7:结合 Matplotlib 定制图形
plt.figure(figsize=(8, 6)) # 设置图形大小 ax = sns.swarmplot(x="day", y="total_bill", hue="smoker", data=tips, palette="Set2", dodge=True) # dodge 参数用于在 hue 分组时避免点重叠 ax.set_title("Swarmplot of Total Bill by Day and Smoker", fontsize=16) # 添加标题并设置字体大小 ax.set_xlabel("Day of the Week", fontsize=12) # 修改 x 轴标签 ax.set_ylabel("Total Bill ($)", fontsize=12) # 修改 y 轴标签 ax.grid(axis='y', linestyle='--', alpha=0.7) # 添加 y 轴网格线 plt.legend(title="Smoker", loc="upper right") # 添加图例并设置标题和位置 plt.tight_layout() # 自动调整子图参数,使图形布局更紧凑 plt.show()
在这个例子中,我们使用了 Matplotlib 的 plt.figure() 函数设置了图形大小,使用 ax.set_title(), ax.set_xlabel(), ax.set_ylabel() 函数添加了标题和修改了轴标签,使用 ax.grid() 函数添加了 y 轴网格线,使用 plt.legend() 函数添加了图例,并使用 plt.tight_layout() 函数调整了图形布局。通过结合 Matplotlib 的定制功能,我们可以创建出更加专业和美观的类别散点图。
结论
类别散点图,特别是 stripplot() 和 swarmplot(),是 Seaborn 分类图模块中非常重要的工具。它们能够有效地展示类别变量与数值变量之间的关系,帮助我们理解不同类别下数据的分布情况。stripplot() 简洁直观,适用于数据量较小的情况;swarmplot() 避免重叠,更清晰地展示数据分布,适用于数据量较大或需要精确观察分布形状的情况。通过灵活选择和定制这两种函数,并结合 Matplotlib 的高级定制功能,我们可以创建出高质量的类别散点图,为数据分析和可视化提供强有力的支持。