3.1 散点图 (scatterplot) 第三章:Seaborn关系图 (Relational Plots) - 3.1 散点图 (scatterplot) 详解 Seaborn 是一个基于 Matplotlib 的 Python 数据可视化库,它提供了更高级别的接口,用于创建美观且信息丰富的统计图形。在 Seaborn 的关系图 (Relational Plots) 模块中,散点图 (scatterplot) 是最基础也是最常用的图形之一。它通过在二维平面上绘制数据点的坐标来展示两个数值变量之间的关系,是探索数据集中变量间关联性的强大工具。 本文将深入探讨 Seaborn 中 函数的使用方法,并通过丰富的代码示例和详细的参数解释,帮助您掌握如何利用散点图进行有效的数据可视化分析。 3.
Seaborn 是一个基于 Matplotlib 的 Python 数据可视化库,它提供了更高级别的接口,用于创建美观且信息丰富的统计图形。在 Seaborn 的关系图 (Relational Plots) 模块中,散点图 (scatterplot) 是最基础也是最常用的图形之一。它通过在二维平面上绘制数据点的坐标来展示两个数值变量之间的关系,是探索数据集中变量间关联性的强大工具。
本文将深入探讨 Seaborn 中 scatterplot() 函数的使用方法,并通过丰富的代码示例和详细的参数解释,帮助您掌握如何利用散点图进行有效的数据可视化分析。
散点图的核心思想非常简单:用点的坐标表示数据集中两个变量的值。每个点代表一个数据样本,点的横坐标对应一个变量的值,纵坐标对应另一个变量的值。通过观察散点图上点的分布模式,我们可以初步判断两个变量之间是否存在某种关系。
散点图的应用场景非常广泛,包括但不限于:
探索变量间的相关性: 散点图可以直观地展示两个数值变量之间是正相关、负相关还是不相关。例如,研究房屋面积与房价、广告投入与销售额等关系。
识别异常值: 散点图中远离大部分数据点的孤立点可能是异常值,需要进一步分析和处理。
发现数据分布模式: 散点图可以揭示数据点的聚集区域、线性趋势、非线性趋势等分布模式,帮助我们更好地理解数据。
比较不同组别的数据: 通过颜色、形状等视觉编码,可以在同一个散点图中展示不同组别的数据,并进行比较分析。
初步建模分析: 在构建回归模型之前,散点图可以帮助我们初步判断变量之间是否存在线性关系,以及选择合适的模型类型。
scatterplot() 函数详解Seaborn 提供了 scatterplot() 函数来创建散点图。该函数位于 seaborn 模块中,可以通过 sns.scatterplot() 方式调用。
sns.scatterplot() 函数的基本语法如下:
seaborn.scatterplot( *, x=None, y=None, hue=None, size=None, style=None, data=None, row=None, col=None, col_wrap=None, hue_order=None, hue_norm=None, sizes=None, size_order=None, size_norm=None, markers=None, style_order=None, legend="auto", ax=None, **kwargs, )
主要参数解释:
x, y (string, numbers (vectors), optional): 指定用于绘制散点图的横轴 (x轴) 和纵轴 (y轴) 变量。这些变量可以是 data DataFrame 中的列名,也可以是数值型数组或 Series。这两个参数是 scatterplot() 函数的核心,必须至少提供 x 和 y 其中之一。 如果只提供 x,则默认 y 轴是索引。
hue (string, numbers (vectors), optional): 指定用于颜色编码的变量。当 hue 参数被指定时,scatterplot() 会根据 hue 变量的不同取值,使用不同的颜色来区分数据点。hue 变量通常是类别型变量,用于展示不同类别数据在散点图上的分布情况。
size (string, numbers (vectors), optional): 指定用于大小编码的变量。当 size 参数被指定时,scatterplot() 会根据 size 变量的不同取值,使用不同大小的点来表示数据点。size 变量通常是数值型变量,用于展示第三个数值变量的信息。
style (string, numbers (vectors), optional): 指定用于形状编码的变量。当 style 参数被指定时,scatterplot() 会根据 style 变量的不同取值,使用不同的点形状 (marker) 来区分数据点。style 变量通常是类别型变量,与 hue 参数类似,用于展示不同类别数据,但使用形状而非颜色进行区分。
data (DataFrame, array, or list of arrays, optional): 指定输入数据集。如果 x, y, hue, size, style 等参数是字符串,则这些字符串会被解释为 data DataFrame 中的列名。如果 data 参数未提供,则 x 和 y 等参数必须是数值型数组或 Series。
row, col (string, numbers (vectors), optional): 指定用于创建小面网格 (facet grid) 的变量。当 row 或 col 参数被指定时,scatterplot() 会根据这些变量的不同取值,创建多个子图 (axes),并将数据按照这些变量进行分组,在不同的子图中绘制散点图。这对于展示条件关系非常有用。
col_wrap (int, optional): 当使用 col 参数创建小面网格时,col_wrap 参数可以指定每行最多显示的子图数量,用于控制网格的布局。
hue_order, size_order, style_order (lists, optional): 指定 hue, size, style 变量的取值顺序。这可以控制图例中类别的排列顺序。
hue_norm, size_norm (tuple or matplotlib.colors.Normalize, optional): 用于标准化 hue 和 size 变量的取值范围。通常用于处理数值型 hue 或 size 变量,并控制颜色或大小映射的范围。
sizes (list, tuple, dict, optional): 指定 size 变量的大小范围或大小映射关系。可以是数值范围 (tuple),也可以是字典 (用于自定义大小映射)。
markers (list or dict, optional): 指定 style 变量的形状映射关系。可以是形状列表 (用于循环使用形状),也可以是字典 (用于自定义形状映射)。
legend ("auto", "brief", "full", False, optional): 控制图例的显示方式。默认为 "auto",自动判断是否显示图例。可以设置为 "brief" (只显示部分图例), "full" (显示完整图例), 或 False (不显示图例)。
ax (matplotlib axes, optional): 指定在哪个 Matplotlib axes 对象上绘制散点图。如果未指定,则 Seaborn 会自动创建一个新的 axes 对象。
**kwargs (key, value mappings): 其他传递给 Matplotlib scatter() 函数的参数,例如 alpha (透明度), linewidth (线宽), edgecolor (边缘颜色) 等。
mermaid graph TD 图解 scatterplot() 函数参数关系:
图解说明:
sns.scatterplot() 函数接收多个参数,其中 x, y, data 是基础参数,用于指定数据和坐标轴变量。
hue, size, style 参数用于添加视觉编码,增强散点图的信息表达能力。
row, col, col_wrap 参数用于创建小面网格,展示条件关系。
其他参数如 hue_order, sizes, markers, legend, ax, **kwargs 等用于更精细地控制散点图的样式和细节。
scatterplot() 创建散点图接下来,我们将通过一系列代码示例,演示如何使用 scatterplot() 函数创建各种类型的散点图。我们将使用 Seaborn 内置的 tips 数据集作为示例数据。
1. 基本散点图:展示两个数值变量的关系
首先,我们加载 tips 数据集,并创建一个简单的散点图,展示 "total_bill" (总账单) 和 "tip" (小费) 之间的关系。
import seaborn as sns import matplotlib.pyplot as plt # 加载 tips 数据集 tips = sns.load_dataset("tips") # 创建基本散点图 sns.scatterplot(x="total_bill", y="tip", data=tips) plt.title("Total Bill vs Tip") plt.show()
代码解释:
sns.load_dataset("tips"):加载 Seaborn 内置的 tips 数据集。
sns.scatterplot(x="total_bill", y="tip", data=tips):调用 scatterplot() 函数,指定 x 轴为 "total_bill" 列,y 轴为 "tip" 列,数据来源为 tips DataFrame。
plt.title("Total Bill vs Tip"):使用 Matplotlib 设置图表标题。
plt.show():显示图表。
运行这段代码,您将看到一个简单的散点图,横轴是 "total_bill",纵轴是 "tip"。通过观察散点图,我们可以初步判断总账单和小费之间存在正相关关系,即总账单越高,小费通常也越高。
2. 使用 hue 参数:添加类别型变量的颜色编码
为了进一步分析,我们可以使用 hue 参数,根据 "sex" (性别) 变量对数据点进行颜色编码,观察不同性别顾客的小费习惯。
sns.scatterplot(x="total_bill", y="tip", hue="sex", data=tips) plt.title("Total Bill vs Tip, Colored by Sex") plt.show()
代码解释:
hue="sex":在 scatterplot() 函数中添加 hue="sex" 参数,指定使用 "sex" 列作为颜色编码变量。运行这段代码,您将看到散点图上的点被颜色区分,不同的颜色代表不同的性别 (例如,蓝色代表 Male,橙色代表 Female)。通过观察,我们可以比较不同性别顾客在总账单和小费之间的关系是否存在差异。
3. 使用 size 参数:添加数值型变量的大小编码
除了颜色编码,我们还可以使用 size 参数,根据 "size" (用餐人数) 变量对数据点进行大小编码,展示第三个数值变量的信息。
sns.scatterplot(x="total_bill", y="tip", size="size", data=tips) plt.title("Total Bill vs Tip, Sized by Party Size") plt.show()
代码解释:
size="size":在 scatterplot() 函数中添加 size="size" 参数,指定使用 "size" 列作为大小编码变量。运行这段代码,您将看到散点图上的点大小不一,点的大小代表用餐人数。通过观察,我们可以了解用餐人数对总账单和小费的影响。例如,较大尺寸的点可能对应较高的总账单和小费。
4. 使用 style 参数:添加类别型变量的形状编码
与 hue 参数类似,style 参数也可以用于类别型变量的编码,但它使用形状而非颜色来区分数据点。我们可以使用 style 参数根据 "smoker" (是否吸烟) 变量进行形状编码。
sns.scatterplot(x="total_bill", y="tip", style="smoker", data=tips) plt.title("Total Bill vs Tip, Styled by Smoker") plt.show()
代码解释:
style="smoker":在 scatterplot() 函数中添加 style="smoker" 参数,指定使用 "smoker" 列作为形状编码变量。运行这段代码,您将看到散点图上的点形状不同,不同的形状代表不同的吸烟习惯 (例如,圆形代表 No,叉号代表 Yes)。通过观察,我们可以比较吸烟与非吸烟顾客在总账单和小费之间的关系是否存在差异。
5. 组合使用 hue, size, style 参数:多变量信息展示
scatterplot() 函数允许同时使用 hue, size, style 参数,将多个变量的信息编码到同一个散点图中,实现更丰富的数据可视化效果。例如,我们可以同时使用 "sex" (性别) 作为颜色编码,"size" (用餐人数) 作为大小编码,"smoker" (是否吸烟) 作为形状编码。
sns.scatterplot( x="total_bill", y="tip", hue="sex", size="size", style="smoker", data=tips, ) plt.title("Total Bill vs Tip, Encoded by Sex, Size, and Smoker") plt.show()
代码解释:
hue="sex", size="size", style="smoker" 参数,将三个变量的信息同时编码到散点图中。运行这段代码,您将看到一个信息量更丰富的散点图,点的大小、颜色和形状都代表不同的数据维度。通过观察,我们可以同时分析性别、用餐人数和吸烟习惯对总账单和小费的影响。
6. 使用 row 和 col 参数:创建小面网格 (Facet Grid)
为了更深入地分析数据,我们可以使用 row 和 col 参数创建小面网格,将数据按照类别变量进行分组,在不同的子图中绘制散点图,从而展示条件关系。例如,我们可以使用 "day" (星期) 和 "time" (时段) 变量创建小面网格,分别展示不同星期和不同时段的总账单和小费关系。
sns.relplot( x="total_bill", y="tip", hue="smoker", col="time", row="day", kind="scatter", # 明确指定 kind="scatter" data=tips, ) plt.suptitle("Total Bill vs Tip, Faceted by Day and Time", y=1.02) # 添加总标题 plt.show()
代码解释:
sns.relplot(...): 使用 relplot() 函数创建关系图,并设置 kind="scatter" 指定类型为散点图。relplot() 函数是更通用的关系图函数,可以创建多种关系图,包括散点图、折线图等。
col="time", row="day":指定使用 "time" 列作为列分组变量,"day" 列作为行分组变量,创建小面网格。
plt.suptitle(...): 使用 Matplotlib 设置整个图形的总标题,并调整 y 坐标使其不与子图重叠。
运行这段代码,您将看到一个由多个子图组成的小面网格,每个子图对应不同的星期和时段组合。在每个子图中,都绘制了总账单和小费的散点图,并使用颜色编码区分是否吸烟。通过观察这个小面网格,我们可以更清晰地比较不同条件下的数据关系。
7. 自定义散点图样式:使用 markers, sizes, palette, alpha 等参数
scatterplot() 函数提供了丰富的参数用于自定义散点图的样式,使其更美观和更符合需求。例如,我们可以使用 markers 参数自定义形状,sizes 参数自定义大小范围,palette 参数自定义颜色调色板,alpha 参数调整透明度等。
sns.scatterplot( x="total_bill", y="tip", hue="day", style="smoker", size="size", sizes=(20, 200), # 设置大小范围 palette="viridis", # 设置颜色调色板 markers=["o", "s"], # 设置形状 alpha=0.7, # 设置透明度 edgecolor="black", # 设置边缘颜色 linewidth=0.5, # 设置边缘线宽 data=tips, ) plt.title("Customized Scatterplot") plt.show()
代码解释:
sizes=(20, 200):设置 size 变量的大小范围为 20 到 200。
palette="viridis":设置 hue 变量的颜色调色板为 "viridis"。Seaborn 提供了多种内置调色板,可以参考 Seaborn 文档选择合适的调色板。
markers=["o", "s"]: 设置 style 变量的形状列表,分别使用圆形 ("o") 和正方形 ("s") 两种形状。
alpha=0.7:设置点的透明度为 0.7,使点稍微透明,避免重叠的点完全遮挡。
edgecolor="black", linewidth=0.5: 设置点的边缘颜色和线宽,增强点的轮廓。
运行这段代码,您将看到一个样式更加丰富的散点图,点的颜色、大小、形状和透明度都经过了自定义设置,使其更易于阅读和理解。
本文详细介绍了 Seaborn 库中 scatterplot() 函数的使用方法,通过丰富的代码示例和参数解释,帮助您掌握了如何创建各种类型的散点图,包括基本散点图、颜色编码散点图、大小编码散点图、形状编码散点图、多变量编码散点图以及小面网格散点图。同时,我们也演示了如何自定义散点图的样式,使其更美观和更具信息量。
总结 scatterplot() 函数的优势:
简洁易用: Seaborn 的 scatterplot() 函数接口简洁,参数易于理解和使用,可以快速创建高质量的散点图。
功能强大: scatterplot() 函数提供了丰富的参数,可以灵活地控制散点图的各个方面,包括数据编码、样式设置、小面网格等,满足各种数据可视化需求。
美观性强: Seaborn 基于 Matplotlib 构建,并提供了更高级别的接口和默认样式,生成的散点图美观且专业。
与其他 Seaborn 函数无缝集成: scatterplot() 函数可以与其他 Seaborn 函数 (如 relplot(), catplot(), displot() 等) 无缝集成,方便构建更复杂的数据可视化分析流程。
扩展学习建议:
探索更多 Seaborn 关系图: 除了 scatterplot(),Seaborn 关系图模块还包括 lineplot() (折线图), relplot() (关系图总函数) 等,可以学习并掌握这些函数的使用,扩展您的数据可视化技能。
深入学习 Matplotlib: Seaborn 基于 Matplotlib 构建,了解 Matplotlib 的底层原理和 API 可以帮助您更深入地理解 Seaborn,并进行更高级的自定义和扩展。
实践不同数据集: 尝试使用 scatterplot() 函数分析不同的数据集,例如 iris, titanic, flights 等 Seaborn 内置数据集,以及您自己的数据集,加深对散点图应用场景的理解。
结合其他数据分析工具: 将 Seaborn 散点图与其他数据分析工具 (如 Pandas, NumPy, Scikit-learn 等) 结合使用,构建完整的数据分析流程,从数据预处理、可视化探索到模型构建和评估。
希望本文能够帮助您更好地理解和使用 Seaborn 的散点图功能,并在数据分析和可视化工作中发挥其强大的作用。如果您有任何问题或建议,欢迎随时提出。