Seaborn
约 1403 字大约 5 分钟
2025-10-03
介绍
Seaborn 是一个基于 Matplotlib 的 Python 数据可视化库,它提供了更高级的接口,用于创建具有吸引力和信息丰富的统计图形。
- 主要特点
- 美观的默认样式:Seaborn 提供了精心设计的默认颜色主题和绘图样式,使图表更具吸引力。
- 简化复杂可视化:只需几行代码即可创建复杂的可视化,如热图、小提琴图等。
- 与
Pandas良好集成:直接支持 Pandas DataFrame 数据结构。 - 统计功能:内置支持统计模型可视化,如回归图、分布图等。
- 多变量关系可视化:擅长展示多个变量之间的关系。
- 基本图表类型
- 分布图:
histplot,kdeplot - 分类图:
boxplot,violinplot,swarmplot - 关系图:
scatterplot,lineplot - 回归图:
lmplot,regplot - 矩阵图:
heatmap,clustermap - 多图网格:
FacetGrid,PairGrid
- 分布图:
准备工作
- 安装
Seaborn- 使用
pip安装pip install seaborn - 使用
conda命令安装conda install seaborn
- 使用
- 套用 seaborn 默认配置
import seaborn as sns sns.set()
通用配置
内置数据集tips
Seaborn 内置的 tips 数据集是一个经典的餐厅小费数据集,常用于演示统计分析和数据可视化。
import seaborn as sns
# 加载数据集
tips = sns.load_dataset("tips")
pd.set_option('display.max_rows', None) # 显示所有行
print(tips)可以看到tip中的数据如下:

样式设置
整体样式
关联sns.set_style()、sns.set_context()
# 可用样式:darkgrid, whitegrid, dark, white, ticks
sns.set_style("whitegrid") # 设置样式
sns.set_context("paper") # 设置上下文
# paper: 适合打印的样式
# notebook: 适合 Jupyter Notebook
# talk: 适合演示文稿
# poster: 适合海报
# 或者一次性设置
sns.set(style="whitegrid", context="notebook", font_scale=1.2)自定义颜色主题
关联sns.set_palette()
# 设置调色板
sns.set_palette("husl") # 其他选项:deep, muted, bright, pastel, dark, colorblind
# 或者使用自定义颜色列表
custom_palette = ["#FF6B6B", "#4ECDC4", "#45B7D1", "#F9A826"]
sns.set_palette(custom_palette)图表尺寸比例
关联plt.figure(), sns.set()
# 设置图表大小
plt.figure(figsize=(10, 6)) # 宽度, 高度
# 或者使用 Seaborn 的方式
sns.set(rc={'figure.figsize':(10, 6)})标题和标签配置
# 通用标题配置
plt.title("Your Title",
fontsize=16,
fontweight='bold',
pad=20, # 标题与图表的间距
loc='center') # 位置:left, center, right
plt.xlabel("X Axis Label", fontsize=12, fontweight='bold')
plt.ylabel("Y Axis Label", fontsize=12, fontweight='bold')图例配置
关联plt.legend(), sns.move_legend()
# 添加图例
plt.legend(title="Legend Title",
loc='best', # 位置:best, upper right, lower left 等
frameon=True, # 是否显示边框
shadow=True, # 是否显示阴影
fancybox=True, # 圆角边框
alpha=0.7, # 透明度
fontsize=10)
# 或者通过 Seaborn 函数
sns.move_legend(ax, "upper left", bbox_to_anchor=(1, 1))坐标轴配置
# 设置坐标轴范围
plt.xlim(0, 100)
plt.ylim(0, 50)
# 设置刻度标签
plt.xticks(rotation=45) # 旋转x轴标签
plt.yticks(fontsize=10) # 设置y轴字体大小
# 网格线配置
plt.grid(True, alpha=0.3, linestyle='--')通用绘图参数
关联 sns.scatterplot(), sns.barplot(), sns.lineplot()
大多数 Seaborn 绘图函数都支持这些通用参数
# 颜色相关
sns.scatterplot(data=data, x="x", y="y",
hue="category", # 按颜色分组
size="value", # 按大小分组
style="type", # 按样式分组
palette="viridis", # 颜色方案
alpha=0.7) # 透明度
# 统计相关
sns.barplot(data=data, x="x", y="y",
estimator=np.mean, # 统计函数:mean, median, sum, etc.
ci=95, # 置信区间
n_boot=1000) # bootstrap 次数
# 外观相关
sns.lineplot(data=data, x="x", y="y",
linewidth=2, # 线宽
linestyle='--', # 线型
markers=True, # 是否显示标记
markersize=8) # 标记大小子图配置
关联sns.scatterplot(), sns.histplot()
# 创建子图网格
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
# 为每个子图单独设置
sns.scatterplot(data=data, x="x1", y="y1", ax=axes[0,0])
axes[0,0].set_title("Subplot 1")
sns.histplot(data=data, x="x2", ax=axes[0,1])
axes[0,1].set_title("Subplot 2")保存图表
关联plt.savefig()
# 保存高质量图片
plt.savefig("plot.png",
dpi=300, # 分辨率
bbox_inches='tight', # 去除白边
facecolor='white', # 背景色
edgecolor='none') # 边框颜色基本绘图
分布图
关联:sns.histplot(), sns.kdeplot()
直方图sns.histplot()
tips = sns.load_dataset("tips")
sns.histplot(data=tips, x="total_bill", kde=True)
plt.title("Total Bill Distribution")
plt.show()
核密度估计图sns.kdeplot()
tips = sns.load_dataset("tips")
sns.kdeplot(data=tips, x="total_bill", hue="time", fill=True)
plt.title("Density Distribution by Meal Time")
plt.show()
分类图
关联:sns.boxplot(), sns.violinplot(), sns.swarmplot()
箱型图sns.boxplot()
tips = sns.load_dataset("tips")
sns.boxplot(data=tips, x="day", y="total_bill", hue="sex")
plt.title("Total Bill by Day and Gender")
plt.show()
小提琴图sns.violinplot()
tips = sns.load_dataset("tips")
sns.violinplot(data=tips, x="day", y="total_bill", hue="sex", split=True)
plt.title("Detailed Distribution by Day and Gender")
plt.show()
蜂群图sns.swarmplot()
tips = sns.load_dataset("tips")
sns.swarmplot(data=tips, x="day", y="total_bill", hue="sex", dodge=True)
plt.title("Individual Data Points by Day and Gender")
plt.show()
关系图
关联:sns.scatterplot(), sns.lineplot()
散点图sns.scatterplot()
tips = sns.load_dataset("tips")
sns.scatterplot(data=tips, x="total_bill", y="tip", hue="size", size="size")
plt.title("Total Bill vs Tip Amount")
plt.show()
线图sns.lineplot()
tips = sns.load_dataset("tips")
sns.lineplot(data=tips, x="size", y="total_bill", hue="sex", errorbar='sd')
plt.title("Average Bill by Party Size and Gender")
plt.show()
回归图
关联:sns.regplot(), sns.lmplot()
线性回归图sns.regplot()
tips = sns.load_dataset("tips")
sns.regplot(data=tips, x="total_bill", y="tip", scatter_kws={"alpha":0.3})
plt.title("Linear Regression: Bill vs Tip")
plt.show()
带分类的回归图sns.lmplot()
tips = sns.load_dataset("tips")
sns.lmplot(data=tips, x="total_bill", y="tip", hue="smoker", col="time")
plt.suptitle("Regression Analysis by Smoking Status and Meal Time")
plt.show()
矩阵图
关联:sns.heatmap(), sns.clustermap()
热力图sns.heatmap()
tips = sns.load_dataset("tips")
# 创建相关矩阵
numeric_cols = tips.select_dtypes(include=[np.number]).columns
corr_matrix = tips[numeric_cols].corr()
# 热力图
plt.figure(figsize=(8, 6))
sns.heatmap(corr_matrix, annot=True, cmap="coolwarm", center=0)
plt.suptitle("Correlation Matrix Heatmap", y=1.05, fontsize=14, fontweight='bold')
plt.tight_layout()
plt.show()
聚类热力图sns.clustermap()
tips = sns.load_dataset("tips")
corr_matrix = tips[numeric_cols].corr()
g = sns.clustermap(corr_matrix,
cmap="coolwarm",
annot=True,
figsize=(8, 6),
center=0)
plt.suptitle("Clustered Correlation Matrix", y=1.05, fontsize=14, fontweight='bold')
plt.tight_layout()
plt.show()多图网格
关联:sns.FacetGrid(), sns.PairGrid()
分面图sns.FacetGrid()
tips = sns.load_dataset("tips")
g = sns.FacetGrid(tips, col="time", row="smoker")
g.map(sns.scatterplot, "total_bill", "tip")
g.fig.suptitle("Time and Smoking Status", y=1.05)
plt.show()
配对图sns.PairGrid()
# 选择部分数值列用于PairGrid
tips = sns.load_dataset("tips")
selected_cols = ['total_bill', 'tip', 'size']
# 创建PairGrid
g = sns.PairGrid(tips[selected_cols])
g.map_upper(sns.scatterplot, alpha=0.6)
g.map_lower(sns.kdeplot, fill=True)
g.map_diag(sns.histplot, kde=True)
plt.suptitle("PairGrid of Numerical Features", y=1.05)
plt.tight_layout()
plt.show()
