Skip to content

Seaborn

介绍

Seaborn 是一个基于 Matplotlib 的 Python 数据可视化库,它提供了更高级的接口,用于创建具有吸引力和信息丰富的统计图形。

  • 主要特点
    • 美观的默认样式:Seaborn 提供了精心设计的默认颜色主题和绘图样式,使图表更具吸引力。
    • 简化复杂可视化:只需几行代码即可创建复杂的可视化,如热图、小提琴图等。
    • Pandas良好集成:直接支持 Pandas DataFrame 数据结构。
    • 统计功能:内置支持统计模型可视化,如回归图、分布图等。
    • 多变量关系可视化:擅长展示多个变量之间的关系。
  • 基本图表类型
    • 分布图histplot, kdeplot
    • 分类图boxplot, violinplot, swarmplot
    • 关系图scatterplot, lineplot
    • 回归图lmplot, regplot
    • 矩阵图heatmap, clustermap
    • 多图网格FacetGrid, PairGrid

准备工作

  • 安装Seaborn
    • 使用pip安装
      python
      pip install seaborn
    • 使用 conda 命令安装
      python
      conda install seaborn
  • 套用 seaborn 默认配置
    python
    import seaborn as sns
    sns.set()

通用配置

内置数据集tips

Seaborn 内置的 tips 数据集是一个经典的餐厅小费数据集,常用于演示统计分析和数据可视化。

python
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()

python
# 可用样式: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()

python
# 设置调色板
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()

python
# 设置图表大小
plt.figure(figsize=(10, 6))  # 宽度, 高度

# 或者使用 Seaborn 的方式
sns.set(rc={'figure.figsize':(10, 6)})

标题和标签配置

python
# 通用标题配置
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()

python
# 添加图例
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))

坐标轴配置

python
# 设置坐标轴范围
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 绘图函数都支持这些通用参数

python
# 颜色相关
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()

python
# 创建子图网格
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()

python
# 保存高质量图片
plt.savefig("plot.png", 
            dpi=300,               # 分辨率
            bbox_inches='tight',   # 去除白边
            facecolor='white',     # 背景色
            edgecolor='none')      # 边框颜色

基本绘图

分布图

关联:sns.histplot(), sns.kdeplot()

直方图sns.histplot()

python
tips = sns.load_dataset("tips")
sns.histplot(data=tips, x="total_bill", kde=True)
plt.title("Total Bill Distribution")
plt.show()

核密度估计图sns.kdeplot()

python
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()

python
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()

python
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()

python
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()

python
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()

python
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()

python
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()

python
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()

python
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()

python
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()

python
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()

python
# 选择部分数值列用于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()

Released under the MIT License.