外观
Seaborn
Seaborn 简介
什么是 Seaborn
Seaborn 是一个基于 Python 的数据可视化库,建立在 Matplotlib 之上。它提供了一套高级接口,用于绘制具有吸引力和信息丰富的统计图形。Seaborn 与 Pandas 数据结构紧密集成,使得数据可视化工作更加简洁高效。
Seaborn 的特点
- 美观的默认样式:Seaborn 内置了多种精美的主题和配色方案
- 统计图表丰富:支持多种统计可视化图表,如热力图、小提琴图、箱线图等
- 与 Pandas 深度集成:可以直接接受 DataFrame 和 Series 作为输入
- 多变量关系展示:能够轻松展示多个变量之间的关系
- 简洁的 API:用更少的代码实现更复杂的可视化效果
安装与导入
# 安装 Seaborn
pip install seaborn
# 导入 Seaborn
import seaborn as sns
import matplotlib.pyplot as plt
# 设置中文显示(可选)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = FalseSeaborn 主题与样式
设置主题
Seaborn 提供了 5 种预设主题:
# 可选主题:darkgrid, whitegrid, dark, white, ticks
sns.set_style('whitegrid')
# 设置上下文(预设):paper, notebook, talk, poster
sns.set_context('talk')
# 设置配色方案
sns.set_palette('husl')颜色调色板
Seaborn 提供了丰富的颜色方案:
# 分类调色板
sns.color_palette('deep') # 深色调色板
sns.color_palette('muted') # 柔和调色板
sns.color_palette('pastel') # 粉彩调色板
sns.color_palette('bright') # 明亮调色板
sns.color_palette('dark') # 暗色调色板
# 连续调色板
sns.color_palette('flare') # 火焰色调色板
sns.color_palette('crest') # 山脊调色板
sns.color_palette('viridis') # Viridis调色板
# 查看调色板
sns.palplot(sns.color_palette('husl', 10))单变量分布可视化
直方图(Histplot)
直方图用于展示单个连续变量的分布情况:
import seaborn as sns
import matplotlib.pyplot as plt
# 加载示例数据
tips = sns.load_dataset('tips')
# 绘制直方图
sns.histplot(data=tips, x='total_bill', bins=20, kde=True)
plt.title('消费总额分布')
plt.show()核密度估计图(KDEplot)
核密度估计图可以平滑地展示变量分布:
# 基础 KDE 图
sns.kdeplot(data=tips, x='total_bill')
# 填充样式
sns.kdeplot(data=tips, x='total_bill', fill=True, alpha=0.5)
# 双变量 KDE 图
sns.kdeplot(data=tips, x='total_bill', y='tip')计数图(Countplot)
用于展示分类变量的计数:
# 基础计数图
sns.countplot(data=tips, x='day')
# 水平方向
sns.countplot(data=tips, y='day')
# 添加分类
sns.countplot(data=tips, x='day', hue='sex')双变量关系可视化
散点图(Scatterplot)
散点图用于展示两个连续变量之间的关系:
# 基础散点图
sns.scatterplot(data=tips, x='total_bill', y='tip')
# 添加分类维度
sns.scatterplot(data=tips, x='total_bill', y='tip', hue='sex')
# 添加大小维度
sns.scatterplot(data=tips, x='total_bill', y='tip', hue='sex', size='size')
# 添加样式维度
sns.scatterplot(data=tips, x='total_bill', y='tip',
hue='sex', style='time', size='size')折线图(Lineplot)
用于展示变量随时间或其他变量的变化趋势:
# 加载时间序列数据
fmri = sns.load_dataset('fmri')
# 基础折线图
sns.lineplot(data=fmri, x='timepoint', y='signal')
# 添加分类和置信区间
sns.lineplot(data=fmri, x='timepoint', y='signal',
hue='event', style='event', markers=True, dashes=False)
# 关闭置信区间
sns.lineplot(data=fmri, x='timepoint', y='signal', ci=None)回归图(Regplot)
回归图用于展示变量间的线性关系和拟合线:
# 基础回归图
sns.regplot(data=tips, x='total_bill', y='tip')
# 添加置信区间
sns.regplot(data=tips, x='total_bill', y='tip', ci=95)
# 使用逻辑回归(适用于二分类数据)
tips['big_tip'] = (tips['tip'] / tips['total_bill']) > 0.15
sns.regplot(data=tips, x='total_bill', y='big_tip',
logistic=True, y_jitter=.03)多变量关系可视化
关系图(Relplot)
Relplot 是 figure-level 的接口,可以绘制散点图和折线图:
# 散点图关系图
sns.relplot(data=tips, x='total_bill', y='tip',
hue='sex', style='time', size='size',
col='day', col_wrap=2)
# 折线图关系图
sns.relplot(data=fmri, x='timepoint', y='signal',
hue='event', style='event', kind='line',
col='subject', col_wrap=5, height=3)成对关系图(Pairplot)
展示数据集中所有变量对之间的关系:
# 加载鸢尾花数据集
iris = sns.load_dataset('iris')
# 基础成对图
sns.pairplot(iris)
# 添加分类
sns.pairplot(iris, hue='species')
# 自定义对角线
sns.pairplot(iris, hue='species',
diag_kind='kde', # 对角线类型:hist 或 kde
markers=['o', 's', 'D'])
# 选择特定变量
sns.pairplot(iris, hue='species',
vars=['sepal_length', 'sepal_width', 'petal_length'])分类数据可视化
分类散点图
# Stripplot - 带抖动的散点图
sns.stripplot(data=tips, x='day', y='total_bill', jitter=True)
# Swarmplot - 蜂群散点图(避免重叠)
sns.swarmplot(data=tips, x='day', y='total_bill', hue='sex')箱线图(Boxplot)
# 基础箱线图
sns.boxplot(data=tips, x='day', y='total_bill')
# 添加分类
sns.boxplot(data=tips, x='day', y='total_bill', hue='sex')
# 水平方向
sns.boxplot(data=tips, x='total_bill', y='day', hue='time')小提琴图(Violinplot)
小提琴图结合了箱线图和核密度估计:
# 基础小提琴图
sns.violinplot(data=tips, x='day', y='total_bill')
# 分割小提琴图
sns.violinplot(data=tips, x='day', y='total_bill',
hue='sex', split=True)
# 内部显示类型
sns.violinplot(data=tips, x='day', y='total_bill',
inner='quartile') # quartile, point, stick箱线图与小提琴图结合
# 箱线图与散点图结合
sns.boxplot(data=tips, x='day', y='total_bill')
sns.swarmplot(data=tips, x='day', y='total_bill',
color='black', alpha=0.5)条形图(Barplot)
展示分类变量的均值和置信区间:
# 基础条形图
sns.barplot(data=tips, x='day', y='total_bill')
# 添加分类
sns.barplot(data=tips, x='day', y='total_bill', hue='sex')
# 估计量函数
sns.barplot(data=tips, x='day', y='total_bill',
estimator=sum, # 使用总和而非均值
ci=68) # 置信区间点图(Pointplot)
用于展示分类变量间的关系差异:
# 基础点图
sns.pointplot(data=tips, x='day', y='total_bill')
# 添加分类和连接线
sns.pointplot(data=tips, x='day', y='total_bill',
hue='sex', markers=['o', 's'],
linestyles=['-', '--'])分类图(Catplot)
Catplot 是 figure-level 的分类数据可视化接口:
# 绘制箱线图
sns.catplot(data=tips, x='day', y='total_bill',
kind='box', col='time')
# 绘制小提琴图
sns.catplot(data=tips, x='day', y='total_bill',
kind='violin', hue='sex', split=True)
# 绘制条形图
sns.catplot(data=tips, x='day', y='total_bill',
kind='bar', hue='sex', col='time')矩阵图与热力图
热力图(Heatmap)
热力图用于展示矩阵数据或相关性矩阵:
import numpy as np
# 创建随机数据
data = np.random.randn(10, 12)
# 基础热力图
sns.heatmap(data)
# 添加数值标注
sns.heatmap(data, annot=True, fmt='.2f')
# 相关性热力图
corr = tips.corr()
sns.heatmap(corr, annot=True, cmap='coolwarm',
vmin=-1, vmax=1, center=0,
square=True, linewidths=1)
# 自定义颜色条
sns.heatmap(corr, annot=True, cmap='YlGnBu',
cbar_kws={'label': '相关系数'})聚类热力图(Clustermap)
带有层次聚类的热力图:
# 基础聚类热力图
sns.clustermap(data)
# 标准化数据
sns.clustermap(data, standard_scale=1)
# 使用 Z-score 标准化
sns.clustermap(data, z_score=0)
# 调整聚类方法
sns.clustermap(data, method='average', metric='correlation')分布对比图
联合分布图(Jointplot)
展示两个变量的联合分布和边际分布:
# 散点图 + 边际分布
sns.jointplot(data=tips, x='total_bill', y='tip')
# KDE 联合分布
sns.jointplot(data=tips, x='total_bill', y='tip', kind='kde')
# 六边形分箱
sns.jointplot(data=tips, x='total_bill', y='tip', kind='hex')
# 回归图
sns.jointplot(data=tips, x='total_bill', y='tip', kind='reg')
# 添加分类
sns.jointplot(data=tips, x='total_bill', y='tip',
hue='time', kind='scatter')联合网格图(JointGrid)
更灵活的联合分布图:
g = sns.JointGrid(data=tips, x='total_bill', y='tip')
g.plot(sns.histplot, sns.kdeplot)分面网格(FacetGrid)
FacetGrid 用于按分类变量创建多个子图:
# 创建 FacetGrid
g = sns.FacetGrid(tips, col='time', row='smoker')
# 绘制图形
g.map(sns.histplot, 'total_bill')
# 添加分类
g = sns.FacetGrid(tips, col='day', hue='sex')
g.map(sns.scatterplot, 'total_bill', 'tip')
g.add_legend()
# 自定义函数
def quantile_plot(x, **kwargs):
sns.histplot(x, **kwargs)
plt.axvline(x.quantile(0.5), color='r', linestyle='--')
g = sns.FacetGrid(tips, col='day')
g.map(quantile_plot, 'total_bill')图形元素控制
子图布局
# 创建子图
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
# 在不同子图绘制
sns.histplot(data=tips, x='total_bill', ax=axes[0, 0])
sns.boxplot(data=tips, x='day', y='total_bill', ax=axes[0, 1])
sns.scatterplot(data=tips, x='total_bill', y='tip', ax=axes[1, 0])
sns.heatmap(tips.corr(), annot=True, ax=axes[1, 1])
plt.tight_layout()
plt.show()图形保存
# 保存图形
fig = sns.scatterplot(data=tips, x='total_bill', y='tip')
plt.savefig('scatter_plot.png', dpi=300, bbox_inches='tight')
# 支持 PNG, PDF, SVG, EPS 等格式
plt.savefig('scatter_plot.pdf', format='pdf')样式自定义
# 设置图形大小
plt.figure(figsize=(10, 6))
sns.boxplot(data=tips, x='day', y='total_bill')
# 添加标题和标签
plt.title('各日消费总额分布', fontsize=16)
plt.xlabel('星期', fontsize=12)
plt.ylabel('消费总额', fontsize=12)
# 自定义刻度
plt.xticks(rotation=45)
plt.ylim(0, 60)
# 添加网格
plt.grid(True, alpha=0.3)
plt.show()实用技巧
加载内置数据集
Seaborn 提供了多个内置数据集用于练习:
# 可用数据集
sns.load_dataset('tips') # 小费数据
sns.load_dataset('iris') # 鸢尾花数据
sns.load_dataset('titanic') # 泰坦尼克号数据
sns.load_dataset('penguins') # 企鹅数据
sns.load_dataset('dowjones') # 道琼斯指数
sns.load_dataset('fmri') # fMRI 脑部扫描数据
sns.load_dataset('mpg') # 汽车燃料效率数据常用参数
| 参数 | 说明 |
|---|---|
data | 输入的数据(DataFrame) |
x, y | 指定 x/y 轴的变量名 |
hue | 分类变量(颜色) |
style | 分类变量(样式) |
size | 分类变量(大小) |
col, row | 分面子图的分类变量 |
palette | 指定颜色方案 |
order | 指定分类顺序 |
ci | 置信区间大小 |
estimator | 统计量函数 |
与 Matplotlib 的结合
Seaborn 基于 Matplotlib 构建,可以无缝结合使用:
import matplotlib.pyplot as plt
import seaborn as sns
# 创建图形
fig, ax = plt.subplots(figsize=(10, 6))
# 使用 Seaborn 绘图
sns.boxplot(data=tips, x='day', y='total_bill', ax=ax)
# 使用 Matplotlib 添加元素
ax.set_title('消费统计', fontsize=16)
ax.axhline(y=20, color='r', linestyle='--', label='参考线')
ax.legend()
plt.show()总结
Seaborn 是一个功能强大的数据可视化工具,特别适合数据分析和机器学习中的探索性数据分析。掌握 Seaborn 的核心功能后,你可以:
- 快速创建美观的统计图形
- 轻松探索多变量之间的关系
- 展示数据分布和统计特征
- 生成专业的数据可视化报告
建议结合 Pandas 和 Matplotlib 一起使用,发挥各自的优势,创建更加丰富和专业的数据可视化效果。