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 图形进行进一步的定制。
补充:
hue
、style
和 size
这三个参数的作用是什么?请举例说明。
- 这三个参数都用于对数据进行多维度的可视化编码。
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()
补充:基础文本是”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()
3.各种图形绘制
在绘制以下图形之前,需要加载数据集。Seaborn 提供了内置数据集,我们可以用 sns.load_dataset()
函数来加载,非常方便。
3.1 调色板 (palette)
对于分类数据,选择离散的调色板(如 Set1
, Paired
);对于连续数据,选择渐变调色板(如 viridis
, plasma
);对于有中心值的发散数据,选择发散调色板(如 RdBu
, coolwarm
)。
palette
参数用于控制图表中元素的颜色。Seaborn 提供了一系列预设调色板,你也可以使用 Matplotlib 的调色板。
1
2
# 打印所有可用的Matplotlib 的调色板
plt.colormaps()
1
2
# Seaborn内置的deep调色板
sns.palplot(sns.color_palette("deep"))
默认主题有六种变体,分别为deep
, muted
, pastel
, bright
, dark
, and colorblind
。
更多关于调色板的内容,参考: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()
拓展: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()
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()
拓展:使用 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()
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()
3.5 箱式图 (sns.boxplot)
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()
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()
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()
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()
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()
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()
4.补充
联合分布图 (jointplot
): 用于展示两个变量的联合分布和各自的边缘分布。
1
2
3
sns.jointplot(x='total_bill', y='tip', data=tips, kind='reg') # kind='reg' 添加回归线
plt.show()
成对关系图 (pairplot
): 绘制数据集中所有变量两两之间的散点图,以及对角线上的单变量直方图。
1
2
3
sns.pairplot(tips, hue='sex')
plt.show()