1. Seaborn 简介

  • 定位:基于 Matplotlib 的高级可视化库,简化了统计绘图流程。

  • 特点

    • 内置统计功能(分布、回归、分组统计)。
    • 更加美观的默认样式。
    • 与 Pandas DataFrame 紧密结合。
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

常用数据集:

tips = sns.load_dataset("tips")  # 小费数据
iris = sns.load_dataset("iris")  # 鸢尾花数据

2. 绘图分类

Seaborn 主要分为 5 大类绘图 API:

  1. 关系型图 (relational plots)scatterplot, lineplot
  2. 分布型图 (distribution plots)histplot, kdeplot, displot
  3. 分类图 (categorical plots)barplot, countplot, boxplot, violinplot, stripplot, swarmplot
  4. 矩阵图 (matrix plots)heatmap, clustermap
  5. 回归/统计图 (regression plots)lmplot, regplot, residplot

3. 关系型图

(1) 散点图

sns.scatterplot(x="total_bill", y="tip", data=tips, hue="sex", style="time", size="size")
plt.show()
  • hue:颜色分组
  • style:标记样式分组
  • size:点大小分组

(2) 折线图

sns.lineplot(x="size", y="tip", data=tips, ci=None, hue="sex", marker="o")
  • ci=None 关闭置信区间
  • estimator 可选择 mean, median

4. 分布型图

(1) 直方图

sns.histplot(tips["total_bill"], bins=20, kde=True)

(2) 核密度估计(KDE)

sns.kdeplot(tips["total_bill"], shade=True)

(3) 联合分布图

sns.jointplot(x="total_bill", y="tip", data=tips, kind="hex")
  • kind 可选:scatter, hex, kde, reg

5. 分类图

(1) 箱型图

sns.boxplot(x="day", y="total_bill", data=tips, hue="sex")

(2) 小提琴图

sns.violinplot(x="day", y="total_bill", data=tips, hue="sex", split=True)

(3) 条形图

sns.barplot(x="day", y="tip", data=tips, estimator=sum, ci=None)

(4) 计数图

sns.countplot(x="day", data=tips, hue="sex")

(5) 蜂群图

sns.swarmplot(x="day", y="total_bill", data=tips)

6. 矩阵图

(1) 热力图

corr = tips.corr(numeric_only=True)
sns.heatmap(corr, annot=True, cmap="coolwarm")

(2) 聚类图

sns.clustermap(corr, annot=True, cmap="viridis")

7. 回归与统计图

(1) 回归拟合

sns.regplot(x="total_bill", y="tip", data=tips)

(2) 线性模型图

sns.lmplot(x="total_bill", y="tip", hue="sex", data=tips)

(3) 残差图

sns.residplot(x="total_bill", y="tip", data=tips)

8. Seaborn 风格与调色板

(1) 样式

sns.set_style("whitegrid")  # white, dark, whitegrid, darkgrid, ticks

(2) 调色板

sns.set_palette("Set2")   # deep, muted, bright, pastel, dark, colorblind

(3) 上下文

sns.set_context("talk")  # paper, notebook, talk, poster

9. 高级用法

(1) Pairplot(多变量关系)

sns.pairplot(iris, hue="species")

(2) FacetGrid(分面绘图)

g = sns.FacetGrid(tips, col="sex", row="time", margin_titles=True)
g.map(sns.scatterplot, "total_bill", "tip")

(3) 自定义主题

custom_params = {"axes.spines.right": False, "axes.spines.top": False}
sns.set_theme(style="whitegrid", rc=custom_params)

10. 常见技巧

  • 保存图片
plt.savefig("plot.png", dpi=300, bbox_inches="tight")
  • 与 Pandas 结合
sns.histplot(data=tips, x="total_bill", hue="sex", multiple="stack")
  • 显示中文
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

11.综合示例

示例 1:多变量关系分析(散点 + 回归 + FacetGrid)

import seaborn as sns
import matplotlib.pyplot as plt

tips = sns.load_dataset("tips")

# 按照性别 & 就餐时间分面
g = sns.FacetGrid(tips, col="sex", row="time", margin_titles=True, height=4)
g.map(sns.regplot, "total_bill", "tip", scatter_kws={"alpha":0.5}, line_kws={"color":"red"})
plt.show()

用途:分析不同性别、午餐/晚餐场景下,账单与小费的关系。


示例 2:分布对比(直方图 + KDE + 分组)

iris = sns.load_dataset("iris")

# 对比三类鸢尾花的萼片长度分布
sns.histplot(data=iris, x="sepal_length", hue="species", kde=True, element="step", stat="density", common_norm=False)
plt.title("Distribution of Sepal Length by Species")
plt.show()

用途:可视化不同类别的分布差异,常用于分类问题的数据探索。


示例 3:分类数据比较(箱线图 + 蜂群图)

# 箱线图 + 蜂群点叠加
sns.boxplot(x="day", y="total_bill", hue="sex", data=tips, palette="Set2")
sns.swarmplot(x="day", y="total_bill", hue="sex", data=tips, dodge=True, color=".25")
plt.title("Boxplot + Swarmplot of Total Bill by Day & Sex")
plt.show()

用途:展示不同分组的分布情况,同时用散点避免箱线图掩盖数据细节。


总结:
Seaborn 的核心思想是 以统计数据为中心的可视化,适合快速探索性分析 (EDA)。它可以极大简化 matplotlib 代码,并与 pandas 高度融合。


12. 补充Seaborn 常用关键函数

1. 关系型图(Relational Plots)

sns.scatterplot()
  • 作用:二维散点图,用于数值变量之间的关系可视化。

  • 常用参数

    • x, y:横纵坐标
    • hue:颜色分组
    • style:点样式分组
    • size:点大小分组
    • palette:调色板
  • 示例

sns.scatterplot(x="total_bill", y="tip", data=tips, hue="sex", style="time", size="size")
sns.lineplot()
  • 作用:折线图,适合时间序列或趋势分析。

  • 常用参数

    • ci:置信区间(默认95%,可 None 关闭)
    • estimator:聚合函数(默认 mean,可改 median
  • 示例

sns.lineplot(x="size", y="tip", data=tips, ci=None, hue="sex", marker="o")

2. 分布型图(Distribution Plots)

sns.histplot()
  • 作用:直方图,可叠加 KDE 曲线。

  • 常用参数

    • bins:柱子数量
    • kde=True:叠加核密度曲线
    • multiple:多组数据对比方式(stack 堆叠,dodge 并排)
  • 示例

sns.histplot(data=tips, x="total_bill", hue="sex", kde=True, multiple="stack")
sns.kdeplot()
  • 作用:核密度估计曲线。

  • 常用参数

    • shade=True:填充曲线下方
    • bw_adjust:带宽调整(越小越“尖锐”)
  • 示例

sns.kdeplot(tips["total_bill"], shade=True, bw_adjust=0.5)
sns.jointplot()
  • 作用:显示两个变量的联合分布 + 边际分布。

  • 常用参数

    • kind:图类型 (scatter, hex, kde, reg)
  • 示例

sns.jointplot(x="total_bill", y="tip", data=tips, kind="hex")

3. 分类图(Categorical Plots)

sns.boxplot()
  • 作用:箱线图,展示数据分布和异常值。

  • 常用参数

    • hue:分组比较
    • order:分类顺序
  • 示例

sns.boxplot(x="day", y="total_bill", data=tips, hue="sex")
sns.violinplot()
  • 作用:小提琴图,结合箱线图和 KDE 曲线。

  • 常用参数

    • split=True:双向对比
  • 示例

sns.violinplot(x="day", y="total_bill", data=tips, hue="sex", split=True)
sns.barplot()
  • 作用:条形图,显示分组统计值。

  • 常用参数

    • estimator:统计函数(默认均值)
    • ci:置信区间(None 关闭)
  • 示例

sns.barplot(x="day", y="tip", data=tips, estimator=sum, ci=None)
sns.countplot()
  • 作用:计数条形图。
  • 示例
sns.countplot(x="day", data=tips, hue="sex")

sns.swarmplot()

  • 作用:点状散布(避免重叠,类似蜂群)。
  • 示例
sns.swarmplot(x="day", y="total_bill", data=tips)

4. 矩阵图(Matrix Plots)

sns.heatmap()
  • 作用:热力图,常用于相关矩阵。

  • 常用参数

    • annot=True:显示数值
    • cmap:配色方案
    • center=0:居中对称色带
  • 示例

sns.heatmap(tips.corr(numeric_only=True), annot=True, cmap="coolwarm")
sns.clustermap()
  • 作用:带层次聚类的热力图。
  • 示例
sns.clustermap(tips.corr(numeric_only=True), annot=True, cmap="vlag")

5. 回归图(Regression Plots)

sns.regplot()
  • 作用:散点图 + 线性回归拟合。
  • 示例
sns.regplot(x="total_bill", y="tip", data=tips)
sns.lmplot()
  • 作用:分组回归拟合(FacetGrid 封装)。
  • 示例
sns.lmplot(x="total_bill", y="tip", hue="sex", data=tips)
sns.residplot()
  • 作用:残差图,用于检验回归模型。
  • 示例
sns.residplot(x="total_bill", y="tip", data=tips)

6. 辅助函数

sns.set_style()
sns.set_style("whitegrid")  # white, dark, whitegrid, darkgrid, ticks
sns.set_palette()
sns.set_palette("Set2")  # deep, muted, bright, pastel, dark, colorblind
sns.set_context()
sns.set_context("talk")  # paper, notebook, talk, poster
sns.pairplot()
  • 作用:多维变量的两两关系。
sns.pairplot(iris, hue="species")
sns.FacetGrid()
  • 作用:自定义分面绘制。
g = sns.FacetGrid(tips, col="sex", row="time")
g.map(sns.scatterplot, "total_bill", "tip")

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐