# 一、设置主题和样式
在进行图形绘制之前先设置好主题/样式
# 设置主题/样式(可选)
sns.set_theme(style="darkgrid") # 可选风格:darkgrid, whitegrid, dark, white, ticks
sns.set_palette("husl") # 设置调色板
sns.set_context("paper") # 设置上下文(paper, notebook, talk, poster)
以下是 sns.set_theme()、sns.set_palette() 和 sns.set_context() 的可选参数整理成表格:
# 1. sns.set_theme() 的 style 参数(图表风格)
| 可选值 | 描述 |
|---|---|
"darkgrid" |
默认值,灰色背景 + 白色网格线(适合大多数场景) |
"whitegrid" |
白色背景 + 深色网格线(适合强调数据精度) |
"dark" |
纯灰色背景,无网格线(简洁风格) |
"white" |
纯白色背景,无网格线(极简风格) |
"ticks" |
白色背景 + 坐标轴刻度(无网格线,类似 "white" 但更清晰的刻度) |
# 2. sns.set_palette() 的调色板参数
| 类型 | 可选值示例 |
|---|---|
| Seaborn 内置名称 | "husl", "deep", "muted", "bright", "pastel", "dark", "colorblind" |
| Matplotlib 色板 | "viridis", "plasma", "magma", "cividis"(需安装 Matplotlib) |
| 自定义颜色列表 | ["#FF5733", "#33FF57", "#3357FF"](十六进制/RGB 颜色列表) |
| 其他方法 | sns.color_palette("hls", 8) 或 sns.husl_palette(10) 生成动态调色板 |
# 3. sns.set_context() 的 context 参数(图表比例)
| 可选值 | 描述 |
|---|---|
"paper" |
最小比例(适合论文或小图,字体和线条较细) |
"notebook" |
默认值(适合 Jupyter Notebook 或常规屏幕显示) |
"talk" |
较大比例(适合幻灯片演示,字体和线条加粗) |
"poster" |
最大比例(适合海报或大屏展示,元素显著放大) |
# 附:set_theme() 的完整参数(可选)
| 参数 | 类型 | 描述 |
|---|---|---|
style |
str | 上述风格之一(如 "darkgrid") |
palette |
str/list | 上述调色板之一 |
context |
str/dict | 上述上下文之一或自定义字典 |
font |
str | 字体(如 "sans-serif") |
font_scale |
float | 字体缩放因子(默认 1) |
rc |
dict | 直接覆盖 Matplotlib 的 rcParams |
# 示例代码:
import seaborn as sns
# 综合设置
sns.set_theme(
style="whitegrid", # 风格
palette="husl", # 调色板
context="talk", # 上下文
font="Arial", # 字体
font_scale=1.2 # 字体大小缩放
)
# 单独设置(等效于上面的 palette)
sns.set_palette("husl")
如果需要更详细的参数(如自定义 rc),可以进一步参考 Seaborn 官方文档。
# 二、调用seaborn绘图函数
Seaborn 提供了多种高级绘图函数,主要分为以下几类:关系型、分布型、分类型、回归型、矩阵型 和 其他辅助函数。以下是详细的分类说明和示例:
# 1. 关系型绘图(Relational Plots)
用于展示变量之间的关系(通常用于连续数据)。
| 函数 | 描述 | 示例代码 | 示例图 |
|---|---|---|---|
sns.scatterplot() |
散点图(基础) | sns.scatterplot(data=tips, x="total_bill", y="tip", hue="time") |
![]() |
sns.lineplot() |
折线图(趋势展示) | sns.lineplot(data=flights, x="year", y="passengers", hue="month") |
![]() |
sns.relplot() |
分面关系图(散点) | sns.relplot(data=tips, x="total_bill", y="tip", col="time", kind="scatter") |
![]() |
# 2. 分布型绘图(Distribution Plots)
用于展示数据的分布特征。
| 函数 | 描述 | 示例代码 | 示例图 |
|---|---|---|---|
sns.histplot() |
直方图(单变量分布) | sns.histplot(data=tips, x="total_bill", bins=20, kde=True) |
![]() |
sns.kdeplot() |
核密度估计图(光滑分布) | sns.kdeplot(data=tips, x="total_bill", hue="time", fill=True) |
![]() |
sns.ecdfplot() |
经验累积分布函数图 | sns.ecdfplot(data=tips, x="total_bill", hue="time") |
(示意) |
sns.displot() |
分面分布图(直方/KDE) | sns.displot(data=tips, x="total_bill", col="time", kind="hist") |
![]() |
sns.boxplot() |
箱线图(五数概括) | sns.boxplot(data=tips, x="day", y="total_bill", hue="sex") |
(占位) (Kanaries Docs) |
sns.violinplot() |
小提琴图(分布+密度) | sns.violinplot(data=tips, x="day", y="total_bill", hue="sex", split=True) |
(占位) (GeeksforGeeks) |
# 3. 分类型绘图(Categorical Plots)
用于分类变量的可视化。
| 函数 | 描述 | 示例代码 | 示例图 |
|---|---|---|---|
sns.barplot() |
条形图(均值/置信区间) | sns.barplot(data=tips, x="day", y="total_bill", hue="sex") |
![]() |
sns.countplot() |
计数条形图(频次) | sns.countplot(data=tips, x="day", hue="sex") |
![]() |
sns.pointplot() |
点图(均值+置信区间) | sns.pointplot(data=tips, x="day", y="total_bill", hue="sex") |
![]() |
sns.stripplot() |
散点图(分类+抖动) | sns.stripplot(data=tips, x="day", y="total_bill", hue="sex", dodge=True) |
![]() |
sns.swarmplot() |
蜂群图(无重叠散点) | sns.swarmplot(data=tips, x="day", y="total_bill", hue="sex") |
![]() |
sns.catplot() |
分面绘制分类图(多功能) | sns.catplot(data=tips, x="day", y="total_bill", col="sex", kind="box") |
![]() |
# 4. 回归型绘图(Regression Plots)
用于展示变量间的统计关系(含回归线)。
| 函数 | 描述 | 示例代码 | 示例图 |
|---|---|---|---|
sns.regplot() |
回归散点图(单次拟合) | sns.regplot(data=tips, x="total_bill", y="tip", ci=95) |
![]() |
sns.lmplot() |
分面回归图(多功能) | sns.lmplot(data=tips, x="total_bill", y="tip", col="time", order=2) |
![]() |
# 5. 矩阵型绘图(Matrix Plots)
用于矩阵数据的可视化(如相关性、聚类)。
| 函数 | 描述 | 示例代码 | 示例图 |
|---|---|---|---|
sns.heatmap() |
热力图(矩阵值颜色映射) | sns.heatmap(data.corr(), annot=True, cmap="coolwarm") |
![]() |
sns.clustermap() |
聚类热力图(行列聚类) | sns.clustermap(data.corr(), method="ward", cmap="vlag") |
![]() |
# 6. 其他辅助函数
| 函数 | 描述 | 示例代码 | 示例图 |
|---|---|---|---|
sns.pairplot() |
变量两两关系矩阵 | sns.pairplot(data=iris, hue="species", diag_kind="kde") |
![]() |
sns.jointplot() |
双变量联合分布图 | sns.jointplot(data=tips, x="total_bill", y="tip", kind="hex") |
![]() |
sns.FacetGrid() |
自定义分面网格(底层控制) | g = sns.FacetGrid(tips, col="time"); g.map(sns.scatterplot, "total_bill", "tip") |
![]() |
# 关键区别:
- 基础函数(如
scatterplot) vs 分面函数(如relplot/catplot):- 基础函数直接绘图,分面函数通过
col/row参数分面。
- 基础函数直接绘图,分面函数通过
- 通用参数:
data:DataFrame 数据源。x/y:轴变量。hue:颜色分组。style:标记样式分组。size:大小分组。
# 示例:分面绘图(catplot)
import seaborn as sns
tips = sns.load_dataset("tips")
# 分面绘制箱线图(按 day 分组,按 sex 分面)
sns.catplot(
data=tips,
x="day",
y="total_bill",
col="sex",
kind="box",
height=4,
aspect=0.7
)
plt.show()
# 三、结合 Matplotlib 细化
Seaborn 虽然提供了简洁的高级 API,但底层仍基于 Matplotlib。通过 matplotlib.pyplot(通常缩写为 plt)可以对 Seaborn 生成的图表进行精细化调整。以下是详细分类说明和实用技巧:
# 3.1基础调整
# 3.1.1 标题与坐标轴标签
import matplotlib.pyplot as plt
import seaborn as sns
tips = sns.load_dataset("tips")
sns.boxplot(data=tips, x="day", y="total_bill")
# 添加标题和标签
plt.title("Daily Bill Distribution", fontsize=14, pad=20) # pad 控制标题距离
plt.xlabel("Day of Week", fontsize=12) # X轴标签
plt.ylabel("Total Bill ($)", fontsize=12) # Y轴标签
# 3.1.2 刻度调整
# 旋转刻度标签(解决重叠问题)
plt.xticks(rotation=45, ha="right") # ha: 旋转后对齐方式(right/center)
# 设置刻度范围和密度
plt.yticks(ticks=[0, 20, 40, 60], fontsize=10) # 自定义Y轴刻度
plt.xlim(-0.5, 3.5) # 设置X轴范围
# 3.2 图例与颜色
# 3.2.1 图例控制
sns.scatterplot(data=tips, x="total_bill", y="tip", hue="time")
# 调整图例
plt.legend(
title="Meal Time", # 修改图例标题
loc="upper right", # 位置(best, upper right, lower left等)
bbox_to_anchor=(1.3, 1), # 将图例移到图外(右侧)
frameon=False # 去掉图例边框
)
# 3.2.2 颜色与样式
# 修改单个元素的颜色(通过Matplotlib)
plt.setp(plt.gca().get_xticklabels(), color="red") # 设置X轴刻度为红色
# 修改所有文本颜色(全局)
plt.rcParams["text.color"] = "blue" # 影响标题、标签等
# 3.3 布局与子图
# 3.3.1 调整边距与布局
plt.tight_layout(pad=2) # 自动调整子图间距(防止标签重叠)
plt.subplots_adjust(
left=0.1, # 左边距
right=0.9, # 右边距
top=0.9, # 上边距
bottom=0.2 # 下边距
)
# 3.3.2 与Matplotlib子图结合
fig, axes = plt.subplots(1, 2, figsize=(12, 5)) # 创建1行2列的子图
# 在第一个子图绘制
sns.histplot(data=tips, x="total_bill", ax=axes[0])
axes[0].set_title("Total Bill Distribution")
# 在第二个子图绘制
sns.boxplot(data=tips, x="day", y="total_bill", ax=axes[1])
axes[1].set_xticklabels(["Thu", "Fri", "Sat", "Sun"]) # 自定义刻度标签
# 3.4 高级定制
# 3.4.1 网格线与背景
plt.grid(True, linestyle="--", alpha=0.6) # 显示网格线(虚线,半透明)
plt.gca().set_facecolor("#f5f5f5") # 设置图表背景色(灰色)
# 3.4.2 注释与箭头
# 添加文本注释
plt.text(
x=30, y=10, # 坐标位置
s="Outlier Point", # 文本内容
fontsize=12,
color="red",
bbox=dict(facecolor="white", alpha=0.8) # 文本框样式
)
# 添加箭头
plt.annotate(
"High Tip",
xy=(40, 10), # 箭头指向的点
xytext=(35, 15), # 文本起始位置
arrowprops=dict(arrowstyle="->", color="black")
)
# 3.5 保存图表
plt.savefig(
"plot.png",
dpi=300, # 分辨率
bbox_inches="tight", # 去除白边
transparent=True # 透明背景(适合PPT)
)
# 3.6 调试技巧
-
获取当前Axes对象:
ax = plt.gca() # 获取当前Axes ax.spines["top"].set_visible(False) # 隐藏顶部边框线 -
批量设置样式:
params = { "axes.labelsize": 14, "xtick.labelsize": 12, "ytick.labelsize": 12 } plt.rcParams.update(params) # 全局生效
# 完整示例
import seaborn as sns
import matplotlib.pyplot as plt
# 数据准备
tips = sns.load_dataset("tips")
# 1. 绘制基础图表
sns.boxplot(data=tips, x="day", y="total_bill", hue="sex")
# 2. 使用Matplotlib调整
plt.title("Bill Distribution by Day and Gender", fontsize=16)
plt.xlabel("Day", fontsize=14)
plt.ylabel("Total Bill (USD)", fontsize=14)
plt.xticks(rotation=15)
plt.legend(title="Gender", bbox_to_anchor=(1, 1))
# 3. 调整布局
plt.tight_layout()
# 4. 保存或显示
plt.savefig("boxplot.png", dpi=200)
plt.show()
# 四、显示或者保存图表格
plt.show()
plt.savefig("plot.png", dpi=300, bbox_inches="tight")





(示意)
(占位) (
(占位) (












