# 一、设置主题和样式

在进行图形绘制之前先设置好主题/样式

# 设置主题/样式(可选)
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") scatterplot
sns.lineplot() 折线图(趋势展示) sns.lineplot(data=flights, x="year", y="passengers", hue="month") lineplot
sns.relplot() 分面关系图(散点) sns.relplot(data=tips, x="total_bill", y="tip", col="time", kind="scatter") relplot scatter

# 2. 分布型绘图(Distribution Plots)

用于展示数据的分布特征。

函数 描述 示例代码 示例图
sns.histplot() 直方图(单变量分布) sns.histplot(data=tips, x="total_bill", bins=20, kde=True) histplot 示例
sns.kdeplot() 核密度估计图(光滑分布) sns.kdeplot(data=tips, x="total_bill", hue="time", fill=True) kdeplot 示例
sns.ecdfplot() 经验累积分布函数图 sns.ecdfplot(data=tips, x="total_bill", hue="time") ecdfplot 示例 (示意)
sns.displot() 分面分布图(直方/KDE) sns.displot(data=tips, x="total_bill", col="time", kind="hist") displot 示例
sns.boxplot() 箱线图(五数概括) sns.boxplot(data=tips, x="day", y="total_bill", hue="sex") boxplot 示例 (占位) (Kanaries Docs)
sns.violinplot() 小提琴图(分布+密度) sns.violinplot(data=tips, x="day", y="total_bill", hue="sex", split=True) violinplot 示例 (占位) (GeeksforGeeks)

# 3. 分类型绘图(Categorical Plots)

用于分类变量的可视化。

函数 描述 示例代码 示例图
sns.barplot() 条形图(均值/置信区间) sns.barplot(data=tips, x="day", y="total_bill", hue="sex") barplot
sns.countplot() 计数条形图(频次) sns.countplot(data=tips, x="day", hue="sex") countplot
sns.pointplot() 点图(均值+置信区间) sns.pointplot(data=tips, x="day", y="total_bill", hue="sex") pointplot
sns.stripplot() 散点图(分类+抖动) sns.stripplot(data=tips, x="day", y="total_bill", hue="sex", dodge=True) stripplot
sns.swarmplot() 蜂群图(无重叠散点) sns.swarmplot(data=tips, x="day", y="total_bill", hue="sex") swarmplot
sns.catplot() 分面绘制分类图(多功能) sns.catplot(data=tips, x="day", y="total_bill", col="sex", kind="box") catplot

# 4. 回归型绘图(Regression Plots)

用于展示变量间的统计关系(含回归线)。

函数 描述 示例代码 示例图
sns.regplot() 回归散点图(单次拟合) sns.regplot(data=tips, x="total_bill", y="tip", ci=95) regplot
sns.lmplot() 分面回归图(多功能) sns.lmplot(data=tips, x="total_bill", y="tip", col="time", order=2) lmplot

# 5. 矩阵型绘图(Matrix Plots)

用于矩阵数据的可视化(如相关性、聚类)。

函数 描述 示例代码 示例图
sns.heatmap() 热力图(矩阵值颜色映射) sns.heatmap(data.corr(), annot=True, cmap="coolwarm") heatmap
sns.clustermap() 聚类热力图(行列聚类) sns.clustermap(data.corr(), method="ward", cmap="vlag") clustermap

# 6. 其他辅助函数

函数 描述 示例代码 示例图
sns.pairplot() 变量两两关系矩阵 sns.pairplot(data=iris, hue="species", diag_kind="kde") pairplot
sns.jointplot() 双变量联合分布图 sns.jointplot(data=tips, x="total_bill", y="tip", kind="hex") jointplot
sns.FacetGrid() 自定义分面网格(底层控制) g = sns.FacetGrid(tips, col="time"); g.map(sns.scatterplot, "total_bill", "tip") FacetGrid

# 关键区别:

  • 基础函数(如 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 调试技巧

  1. 获取当前Axes对象

    ax = plt.gca()  # 获取当前Axes
    ax.spines["top"].set_visible(False)  # 隐藏顶部边框线
  2. 批量设置样式

    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")