Pandas & NumPy Academy · 课时

散点图与成对关系图

使用 sns.scatterplot 按第三个变量着色创建散点图,并使用 sns.pairplot 可视化所有成对关系。

第 3 / 4 课13 个步骤

散点图与成对关系图 是 CoddyKit 上的免费 Pandas & NumPy Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Pandas & NumPy Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Pandas & NumPy Academy 课程共包含 4 节课。

可视化变量之间的关系

分布图一次显示一个变量。当您想了解两个数值变量之间的关系时,就需要使用散点图及相关可视化图表。它们可以帮助您发现相关性(两个变量是否共同增加?)、聚类(数据中是否存在子群体?)以及离群值(是否有远离主要点云的异常点?)。借助 scatterplot 和 pairplot,Seaborn 可以轻松完成这些任务。

import seaborn as sns
import matplotlib.pyplot as plt

# Load the classic iris dataset
iris = sns.load_dataset('iris')
print(iris.head())
print('\nShape:', iris.shape)

使用 sns.scatterplot 绘制基本散点图

sns.scatterplot(data, x, y) 会将每个观测值按照其 (x, y) 坐标绘制为一个点。与 Matplotlib 的 plt.scatter 不同,Seaborn 的版本会自动关联 DataFrame,并支持与 hue、size 和 style 语义集成。只需调用一个函数,便可生成信息丰富的多变量图,并自动添加图例。

import seaborn as sns
import matplotlib.pyplot as plt

tips = sns.load_dataset('tips')

sns.scatterplot(data=tips, x='total_bill', y='tip')
plt.title('Tip vs Total Bill')
plt.xlabel('Total Bill ($)')
plt.ylabel('Tip ($)')
plt.show()

使用 hue 表示第三个变量

hue 参数根据第三个变量为每个点分配颜色,该变量可以是分类变量,也可以是数值变量。当 hue 对应分类列(如 'smoker')时,Seaborn 会使用不同的颜色;当 hue 对应数值列时,则使用连续色图。这样无需增加第三条坐标轴,就能在二维图中同时观察三个变量。

import seaborn as sns
import matplotlib.pyplot as plt

tips = sns.load_dataset('tips')

sns.scatterplot(
    data=tips,
    x='total_bill',
    y='tip',
    hue='time',       # Lunch vs Dinner
    style='smoker',   # marker shape
    palette='deep'
)
plt.title('Tip vs Bill by Time and Smoker Status')
plt.legend(bbox_to_anchor=(1, 1))
plt.tight_layout()
plt.show()

使用大小和样式表示变量

除了 hue 之外,Seaborn 散点图还支持 size(使用点的面积表示数值变量)和 style(使用标记形状表示分类变量)。同时使用这三种语义可以揭示复杂的多变量模式,但也可能让读者难以理解。一个实用原则是:优先使用 hue(最醒目),其次使用 style,只有必要时才使用 size。

import seaborn as sns
import matplotlib.pyplot as plt

tips = sns.load_dataset('tips')

sns.scatterplot(
    data=tips,
    x='total_bill',
    y='tip',
    hue='day',
    size='size',      # party size controls marker area
    sizes=(20, 200),  # min and max dot area
    alpha=0.7
)
plt.title('Tip vs Bill — Colour=Day, Size=Party Size')
plt.legend(bbox_to_anchor=(1, 1))
plt.tight_layout()
plt.show()

使用 regplot 添加回归线

sns.regplot() 会绘制散点图,并叠加一条带阴影的线性回归线及 95% 置信带。这有助于可视化两个变量之间线性关系的强度和方向。在数据密集的区域,置信带会变窄;而在数据较少、位于边缘的区域,置信带会变宽。

import seaborn as sns
import matplotlib.pyplot as plt

tips = sns.load_dataset('tips')

sns.regplot(
    data=tips,
    x='total_bill',
    y='tip',
    scatter_kws={'alpha': 0.4},
    line_kws={'color': 'red'}
)
plt.title('Tip vs Bill with Regression Line')
plt.show()

lmplot:分面回归图

sns.lmplot() 是 regplot 的图形级版本。它支持 hue(在同一面板中为每个组绘制单独的回归线)以及 col/row(创建单独的面板)。这对于检验两个变量之间的关系是否因子群体而异非常有用——例如,晚餐时段的账单与小费关系是否比午餐时段更陡峭。

import seaborn as sns
import matplotlib.pyplot as plt

tips = sns.load_dataset('tips')

# Separate regression line per time (Lunch / Dinner)
sns.lmplot(
    data=tips,
    x='total_bill',
    y='tip',
    hue='time',
    scatter_kws={'alpha': 0.4},
    height=5
)
plt.suptitle('Regression by Meal Time', y=1.02)
plt.show()

成对关系图简介

sns.pairplot(df) 会为 DataFrame 中每一对数值列创建一个散点图网格,并在对角线上显示分布图。这是通过一次调用快速可视化数据集中所有成对关系的方法。对于包含 n 个数值列的 DataFrame,pairplot 会创建一个 n×n 网格。当 n 在 3 到 8 之间时最为实用——网格更大后,各图会变得过小,难以阅读。

import seaborn as sns
import matplotlib.pyplot as plt

iris = sns.load_dataset('iris')

# Create pairplot coloured by species
sns.pairplot(iris, hue='species', diag_kind='kde', plot_kws={'alpha': 0.5})
plt.suptitle('Iris Dataset Pairplot', y=1.02)
plt.show()

自定义 pairplot 的对角线

diag_kind 参数控制 pairplot 网格对角线上显示的内容。使用 'hist' 可绘制直方图,使用 'kde' 可绘制核密度估计图。对角线显示每个变量的单变量分布,而非对角线面板显示成对散点图。您还可以使用 corner=True 只显示下三角区域,这样可以将面板数量减半并减少重复信息。

import seaborn as sns
import matplotlib.pyplot as plt

iris = sns.load_dataset('iris')

# Show only lower triangle
sns.pairplot(
    iris,
    hue='species',
    diag_kind='hist',
    corner=True
)
plt.show()

使用 PairGrid 进行完全自定义

sns.PairGrid 让您可以完全控制矩阵各部分显示的图表类型。使用 g.map_upper()、g.map_lower() 和 g.map_diag() 可分配不同的函数(例如,在上三角使用 regplot,在下三角使用 kdeplot)。这样可以生成达到出版质量的图表,使每个面板都传达有关变量对的独特信息。

import seaborn as sns
import matplotlib.pyplot as plt

iris = sns.load_dataset('iris')
numeric_iris = iris.drop(columns=['species'])

g = sns.PairGrid(numeric_iris)
g.map_upper(sns.scatterplot, alpha=0.3)
g.map_lower(sns.kdeplot, fill=True)
g.map_diag(sns.histplot, kde=True)

plt.suptitle('Custom PairGrid', y=1.02)
plt.show()

识别散点图中的相关性

阅读散点图时,请估计关系的方向(点云是向上还是向下倾斜?)、强度(各点围绕趋势的聚集程度如何?)以及形态(线性还是曲线?)。相关系数 r 的取值范围为 -1(完全负相关)到 +1(完全正相关),0 表示不存在​​线性关系。请记住:相关性不等于因果关系,而且非线性关系的 r 也可能约等于 0。

import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np

np.random.seed(0)
x = np.linspace(0, 10, 100)

fig, axes = plt.subplots(1, 3, figsize=(12, 4))

# Strong positive correlation
axes[0].scatter(x, x + np.random.normal(0, 0.5, 100))
axes[0].set_title('Strong Positive (r≈0.99)')

# Weak correlation
axes[1].scatter(x, np.random.normal(5, 3, 100))
axes[1].set_title('No Correlation (r≈0)')

# Non-linear (quadratic) — r can be low
axes[2].scatter(x, (x-5)**2 + np.random.normal(0, 1, 100))
axes[2].set_title('Non-linear (r low despite pattern)')

plt.tight_layout()
plt.show()

用于带边际分布的二元数据的 jointplot

sns.jointplot()将中央的二元图与顶部和右侧边缘的单变量图结合起来。请传入 kind='scatter'、'hex'、'kde' 或 'reg'。当有数千个重叠点时,hex 类型非常有用——它会将数据分箱为六边形,并用颜色表示密度,从而解决大数据集散点图因过度绘制而难以阅读的问题。

import seaborn as sns
import matplotlib.pyplot as plt

tips = sns.load_dataset('tips')

# KDE joint plot with marginal distributions
sns.jointplot(
    data=tips,
    x='total_bill',
    y='tip',
    kind='reg',
    marginal_kws={'bins': 20}
)
plt.suptitle('Joint Distribution of Bill and Tip', y=1.02)
plt.show()

快速检查

请检验您对本课 Seaborn 散点图和成对关系图的理解。

课程回顾

本课学习了:sns.scatterplot 可通过 x、y、hue、size 和 style 编码最多四个变量;sns.regplot/lmplot 会叠加回归线,以量化线性关系;sns.pairplot 会生成包含所有变量对的网格,非常适合对多变量数据集进行探索性分析。接下来,我们将学习用于可视化相关矩阵的热图。

免费开始

用 AI 导师学习 Python — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
30
课程
120

常见问题解答

「散点图与成对关系图」课时是免费的吗?

是的 — 「散点图与成对关系图」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Pandas & NumPy Academy 课程的其余内容,请升级到 CoddyKit PRO。 Pandas & NumPy Academy 课程共包含 4 节课。

「散点图与成对关系图」这节课中我会学到什么?

使用 sns.scatterplot 按第三个变量着色创建散点图,并使用 sns.pairplot 可视化所有成对关系。 你通过在浏览器中直接运行的动手代码来练习 Pandas & NumPy Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Pandas & NumPy Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Pandas & NumPy Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「散点图与成对关系图」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Pandas & NumPy Academy 课中编写并运行代码吗?

能。每节 Pandas & NumPy Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 分布图:histplot 与 kdeplot
  2. 分类图:boxplot、barplot、violinplot
  3. 散点图与成对关系图
  4. 相关矩阵热力图
← 返回 Pandas & NumPy Academy