seaborn-使用指南

Posted by Hilda on August 1, 2025

Seaborn 是一个基于 Matplotlib 的 Python 数据可视化库。它的核心优势在于提供了一个高级的、面向统计绘图的接口。与 Matplotlib 相比,Seaborn 的默认样式更美观,并且内置了多种数据集中常用的统计图表,如箱线图、热力图、小提琴图等,能够帮助我们快速、优雅地进行数据探索和可视化。

1.安装Seaborn

1
pip install seaborn matplotlib pandas -i https://pypi.tuna.tsinghua.edu.cn/simple

指定了国内镜像源,可以提高安装速度。

2.快速上手与样式设置

Seaborn 的所有图形都是 Matplotlib 的 Axes 对象。这意味着你可以使用 Matplotlib 的函数(如 plt.title(), plt.xlabel(), plt.savefig())对 Seaborn 图形进行进一步的定制。

补充:

huestylesize 这三个参数的作用是什么?请举例说明。

  • 这三个参数都用于对数据进行多维度的可视化编码。hue 通过颜色区分不同类别(图例中会体现),style 通过样式(如虚线、点标记)区分,size 通过大小区分。

2.1 样式设置

在绘制任何图形之前,通常会先通过 sns.set() 函数来设置图表的整体风格。这可以让你在不修改每个图表参数的情况下,获得更具吸引力的外观。

1
2
3
4
5
6
7
8
import seaborn as sns
import matplotlib.pyplot as plt
# 设置图标风格
sns.set(style="darkgrid", context="talk", font="SimHei")
# 绘制一个简单的线性图,展示效果
plt.figure(figsize=(8, 6))
sns.lineplot(x=[1, 2 ,3], y=[5, 6, 7])
plt.plot()

image-20250801143451588

补充:基础文本是”notebook”,和其他文本”paper”,”talk”和”poster”,它们分别是 0.8,1.3 和 1.6 的 notebook 参数版本。

sns.set() 参数详解

参数 效果 选项
style 设置背景风格 'darkgrid', 'whitegrid', 'dark', 'white', 'ticks'
context 调整图表元素(字体、线宽等)的比例 'paper', 'notebook' (默认), 'talk', 'poster'
font 设置字体,用于解决中文乱码 例如 'STKaiti', 'SimHei' 等,需要确保系统已安装该字体
palette 设置默认调色板 'deep', 'muted', 'bright', 'pastel', 'dark', 'colorblind'

2.2 简单的线性图

numpy 数据绘制线形图,展示如何在一张图中绘制多条曲线

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
sns.set(style='dark', context="poster", font="SimHei")

plt.figure(figsize=(9, 6))
# 创建X轴

x = np.linspace(0, 2*np.pi+0.00001, 20)
# y
sns.lineplot(x=x, y = np.sin(x), color="green", ls="--", label="sin(x)")
sns.lineplot(x=x, y = np.cos(x), color="red", ls="-.", label="cos(x)")

# 添加图例

plt.legend()
plt.title("正弦函数和余弦函数")
plt.plot()

image-20250801143849276

3.各种图形绘制

在绘制以下图形之前,需要加载数据集。Seaborn 提供了内置数据集,我们可以用 sns.load_dataset() 函数来加载,非常方便。

3.1 调色板 (palette)

对于分类数据,选择离散的调色板(如 Set1, Paired);对于连续数据,选择渐变调色板(如 viridis, plasma);对于有中心值的发散数据,选择发散调色板(如 RdBu, coolwarm)。

palette 参数用于控制图表中元素的颜色。Seaborn 提供了一系列预设调色板,你也可以使用 Matplotlib 的调色板。

1
2
# 打印所有可用的Matplotlib 的调色板
plt.colormaps()

image-20250801144404104

1
2
# Seaborn内置的deep调色板
sns.palplot(sns.color_palette("deep"))

image-20250801144505157

默认主题有六种变体,分别为deep, muted, pastel, bright, dark, and colorblind

image-20250801144619718

更多关于调色板的内容,参考:https://seaborn.apachecn.org/9/

3.2 线形图 (sns.lineplot)

线形图常用于展示数据随时间或某个连续变量的变化趋势。

1
2
3
4
5
6
7
8
9
10
11
12
13
sns.set(style="dark", context="notebook", font="SimHei")
# 加载数据集
fmri = sns.load_dataset("fmri")

plt.figure(figsize=(9, 6))

# 绘制线性图
ax = sns.lineplot(x="timepoint", y = "signal", hue="event", style="event", data=fmri, palette="deep", 
                 markers=True, markersize=10)
plt.xlabel("时间节点", fontsize=20)
plt.ylabel("信号强度", fontsize=20)
plt.title("不同时间下信号的变化", fontsize=25)
plt.show()

image-20250801145101528

拓展:relplot带网面的线性图

relplot 可以方便地根据一个或多个分类变量创建子图

1
2
3
4
5
g = sns.relplot(x="timepoint", y="signal", hue="event", style="event", col="region", 
              kind="line", data=fmri)
g.fig.suptitle("不同区域的信号变化", y = 1.03)
g.set_axis_labels("时间节点", "信号强度")
plt.show()

image-20250801145416278

3.3 散点图 (sns.scatterplot)

散点图用于观察两个数值型变量之间的关系。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 加载tips数据集
data = sns.load_dataset("tips")
display(data)

plt.figure(figsize=(9, 6), dpi=120)
sns.set(style="darkgrid", context="talk", font="SimHei")

# 散点图

sns.scatterplot(x="total_bill", y="tip", hue="time", data=data, palette="summer", s=100)
plt.xlabel('总消费', fontsize=20)
plt.ylabel('小费', fontsize=20)
plt.title('总消费与小费的关系', fontsize=25)
plt.show()

image-20250801145956058

拓展:使用 size 参数来编码第三个变量

例如,让点的大小反映用餐人数

1
2
3
4
5
6
7
8
plt.figure(figsize=(9, 6))
sns.scatterplot(x='total_bill', y='tip',
                hue='day', size='size',
                data=data,
                palette='viridis')
plt.title('总消费、小费与用餐人数的关系')
plt.show()

image-20250801150120081

3.4 柱状图 (sns.barplot)

柱状图用于展示不同类别下的数值大小,通常会展示均值和置信区间。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import seaborn as sns
import matplotlib.pyplot as plt

plt.figure(figsize=(9, 6))
sns.set(style='whitegrid', font='SimHei')

# 加载 tips 数据集
tips = sns.load_dataset('tips')

# 绘制柱状图,使用 hue 根据 'sex' 分类,capsize 设置误差线帽的宽度
ax = sns.barplot(x='day', y='total_bill',
                 data=tips, hue='sex',
                 palette='colorblind',
                 capsize=0.5)

plt.xlabel('星期', fontsize=20)
plt.ylabel('总消费', fontsize=20)
plt.title('不同星期和性别下的总消费', fontsize=25)
plt.show()

image-20250801150259549

3.5 箱式图 (sns.boxplot)

image-20250801150440169

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import seaborn as sns
import matplotlib.pyplot as plt

sns.set(style='ticks', font='SimHei')
# 加载 tips 数据集
tips = sns.load_dataset('tips')

plt.figure(figsize=(9, 6))
ax = sns.boxplot(x='day', y='total_bill', data=tips, palette='colorblind')

plt.xlabel('星期', fontsize=20)
plt.ylabel('总消费', fontsize=20)
plt.title('总消费的分布情况', fontsize=25)
plt.show()

image-20250801150513487

3.6 直方图 (sns.histplot)

直方图用于展示单个变量的分布情况。kde=True 会叠加一个核密度估计曲线。

1
2
3
4
5
6
7
8
9
10
11
12
13
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

sns.set(style='darkgrid', font='SimHei')

# 示例 1: 使用 numpy 随机数据
plt.figure(figsize=(9, 6))
x = np.random.randn(5000)
sns.histplot(x, kde=True)
plt.title('随机数据的直方图与核密度估计')
plt.show()

image-20250801150633745

1
2
3
4
5
6
# 示例 2: 使用 tips 数据集
plt.figure(figsize=(9, 6))
tips = sns.load_dataset('tips')
sns.histplot(x='total_bill', data=tips, kde=True, hue='sex', bins=20) # 添加 hue 和 bins
plt.title('不同性别总消费的分布')
plt.show()

image-20250801150701065

3.7 分类散点图 (sns.catplot)

catplot 是一个强大的函数,可以创建分类图表的分面网格。它将 relplot 的功能扩展到分类变量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

sns.set(style='darkgrid', font='SimHei')

# 加载 exercise 数据集
exercise = sns.load_dataset('exercise')

# 绘制分类散点图,col="diet" 会根据 diet 属性创建分面网格
g = sns.catplot(x='time', y='pulse', hue='kind', col='diet', data=exercise, kind='swarm')
g.fig.suptitle('不同饮食和时间下的脉搏', y=1.03)
g.set_axis_labels('时间', '脉搏')
plt.show()

image-20250801150848347

3.8 热力图 (sns.heatmap)

热力图用于通过颜色深浅来表示二维数据的数值大小。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd

plt.figure(figsize=(12, 9))
sns.set(font='SimHei')

# 加载 flights 数据集
flights = sns.load_dataset('flights')

# 将数据转换为适合热力图的二维矩阵
flights = flights.pivot(index='month', columns='year', values='passengers')

# 绘制热力图
sns.heatmap(flights, annot=True, fmt='d', cmap='RdBu_r', linewidths=0.5)

plt.title('每年每月航班乘客数量热力图', fontsize=20)
plt.show()


image-20250801151749846

1
2
3
4
5
# 拓展:修改颜色映射(cmap)
plt.figure(figsize=(12, 9))
sns.heatmap(flights, annot=True, fmt='d', cmap='YlGnBu', linewidths=0.5)
plt.title('每年每月航班乘客数量热力图 (YlGnBu)')
plt.show()

image-20250801151817638

4.补充

联合分布图 (jointplot): 用于展示两个变量的联合分布和各自的边缘分布。

1
2
3
sns.jointplot(x='total_bill', y='tip', data=tips, kind='reg') # kind='reg' 添加回归线
plt.show()

image-20250801151909880

成对关系图 (pairplot): 绘制数据集中所有变量两两之间的散点图,以及对角线上的单变量直方图。

1
2
3
sns.pairplot(tips, hue='sex')
plt.show()

image-20250801151957378