19  Seaborn库基础

19.1 引言Seaborn的优势

Seaborn建立在Matplotlib之上: - 更美观: 默认样式更好 - 更简洁: 更少代码实现复杂图表 - 统计图表: 专为统计设计

19.2 泰坦尼克数据集分析

列表 19.1
# ⚠️ 平台原始代码 - 请原样输入至教学平台(注释除外),平台才会判定答案正确
import seaborn as sns  # 导入Seaborn可视化库
import matplotlib.pyplot as plt  # 导入Matplotlib绑图库
# 加载titanic数据集
titanic = sns.load_dataset("titanic")
# 使用catplot函数绘制柱状图
sns.catplot(x="class", y="survived", hue="sex", data=titanic, kind="bar")
# 设置标题
plt.subplots_adjust(top=0.9)
plt.suptitle("Survival rate by class and sex")  # 设置图形总标题
# 显示图形
plt.savefig("1.png")

19.3 常用Seaborn图表

列表 19.2
# =============================================================================
# 题目:Seaborn四种常用统计图表的综合演示
# =============================================================================
# 本代码展示Seaborn的核心图表类型:箱线图(展示分布和异常值)、小提琴图
# (结合箱线图和核密度估计)、热力图(展示相关性矩阵)和散点图带回归线
# (展示变量关系)。这些图表是数据分析和统计建模中的基础工具。

# ==================== 导入必要的库 ====================
import numpy as np  # 导入NumPy库,用于生成随机数
import pandas as pd  # 导入Pandas库,用于数据处理

# ==================== 创建示例数据 ====================
# 设置随机种子,确保每次运行结果相同
np.random.seed(42)  # 42是常用的随机种子,保证代码可重复

# 创建包含100行数据的DataFrame
data = pd.DataFrame({
    # Category列:从A、B、C三个类别中随机抽取100次,生成分类变量
    'Category': np.random.choice(['A', 'B', 'C'], 100),
    # Value1列:生成100个服从标准正态分布的随机数(均值0,标准差1)
    'Value1': np.random.randn(100),
    # Value2列:生成100个标准正态分布随机数后加2,使其均值变为2
    'Value2': np.random.randn(100) + 2  # 这使得Value2整体大于Value1
})

# ==================== 创建2x2的子图布局 ====================
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
# 创建画布和子图数组,总尺寸12x10英寸

# ==================== 子图1:箱线图 ====================
# 箱线图展示数据的分布特征:中位数、四分位数、异常值
sns.boxplot(data=data, x='Category', y='Value1', ax=axes[0, 0])
# x参数指定分类变量(横轴)
# y参数指定连续变量(纵轴)
# 箱线图从下到上依次表示:最小值、Q1(25%)、中位数、Q3(75%)、最大值
# 超出1.5倍IQR(四分位距)的点会被标记为异常值

# 设置子图1标题
axes[0, 0].set_title('箱线图')  # 箱线图能快速识别数据分布和异常值

# ==================== 子图2:小提琴图 ====================
# 小提琴图是箱线图和核密度图的结合,更直观地展示分布形状
sns.violinplot(data=data, x='Category', y='Value1', ax=axes[0, 1])
# 参数含义与boxplot相同,但视觉效果更丰富
# 小提琴的宽度表示数据在该值的密度,越宽表示出现频率越高

# 设置子图2标题
axes[0, 1].set_title('小提琴图')  # 能看到分布的对称性、峰度等特征

# ==================== 子图3:热力图 ====================
# 计算Value1和Value2的相关系数矩阵
corr = data[['Value1', 'Value2']].corr()
# corr()方法计算皮尔逊相关系数,衡量两个变量的线性相关程度
# 返回一个2x2的对称矩阵,对角线为1(自相关),非对角线为互相关

# 使用热力图可视化相关系数矩阵
sns.heatmap(corr, annot=True, cmap='coolwarm', ax=axes[1, 0])
# annot=True表示在热力图的每个格子上显示数值
# cmap='coolwarm'指定颜色方案(冷色表示负相关,暖色表示正相关)
# 热力图用颜色深浅表示相关系数大小,一目了然

# 设置子图3标题
axes[1, 0].set_title('相关性热力图')  # 展示变量间的线性关系强度

# ==================== 子图4:散点图带回归线 ====================
# regplot结合散点图和线性回归拟合,展示变量关系和趋势
sns.regplot(data=data, x='Value1', y='Value2', ax=axes[1, 1])
# x参数指定自变量(横轴)
# y参数指定因变量(纵轴)
# 自动计算并绘制线性回归线,以及95%置信区间(半透明阴影)

# 设置子图4标题
axes[1, 1].set_title('散点图与回归线')  # 直观判断变量关系和拟合优度

# ==================== 调整布局并显示 ====================
plt.tight_layout()  # 自动调整子图间距
plt.show()  # 显示完整的四合一图表

# 输出解读:
# 图1的箱线图展示了三个类别数据的分布特征和异常值
# 图2的小提琴图更细致地显示了分布形状,可能发现多峰分布等特征
# 图3的热力图显示Value1和Value2的相关系数(接近0表示无相关)
# 图4的散点图和回归线直观展示了两个变量的线性关系强度

19.4 样式设置

列表 19.3
# =============================================================================
# 题目:Seaborn样式和配色方案的自定义
# =============================================================================
# 本代码演示如何设置Seaborn的全局样式和配色方案,使图表更美观、更符合
# 个性化需求。Seaborn提供了5种内置样式和多种配色方案,适合不同的场景
# 和数据类型。

# ==================== 设置Seaborn样式 ====================
# set_style()设置图表的整体风格,影响背景、网格、坐标轴等元素
sns.set_style("whitegrid")  # 使用白色背景+灰色网格,适合大多数数据可视化场景
# 可选样式:
# "whitegrid": 白色背景,带网格(推荐用于数据展示)
# "darkgrid": 深色背景,带网格(适合深色主题)
# "white": 纯白背景,无网格(简洁风格)
# "dark": 深色背景,无网格(护眼模式)
# "ticks": 白色背景,仅保留刻度线(学术风格)

# ==================== 设置配色方案 ====================
# set_palette()设置图表的颜色循环顺序,影响所有使用颜色的图表元素
sns.set_palette("husl")  # 使用HUSL配色方案,颜色鲜艳且区分度高
# 常用配色方案:
# "husl": 均匀分布的色彩空间,适合分类数据
# "pastel": 柔和的粉彩色系
# "dark": 深色调
# "colorblind": 色盲友好的配色
# "Set1", "Set2": matplotlib的内置配色

# ==================== 创建散点图 ====================
# 创建一个新的画布,尺寸为10x6英寸
plt.figure(figsize=(10, 6))  # 单独创建画布,不使用子图

# 加载Seaborn内置的小费数据集(餐厅顾客的小费记录)
data_plot = sns.load_dataset('tips')
# 该数据集包含total_bill(总账单)、tip(小费)、day(星期)、size(人数)等字段

# 绘制多维散点图,通过颜色和大小区分不同维度
sns.scatterplot(data=data_plot, x='total_bill', y='tip', hue='day', size='size')
# x参数指定横轴变量(总账单金额)
# y参数指定纵轴变量(小费金额)
# hue参数指定按星期着色,不同星期用不同颜色表示
# size参数指定按人数映射点的大小,人数越多点越大

# ==================== 设置图表标签和标题 ====================
plt.title('餐厅小费分析', fontsize=14)  # 设置图表标题,字体大小14
plt.xlabel('总账单', fontsize=12)  # 设置横轴标签,字体大小12
plt.ylabel('小费', fontsize=12)  # 设置纵轴标签,字体大小12

# 设置图例
plt.legend(title='星期')  # 图例标题设为"星期",显示每天的标识

# ==================== 显示图表 ====================
plt.show()  # 展示完整的散点图

# 输出解读:
# 散点图展示了总账单与小费金额的正相关关系
# - 不同颜色(星期)的点的分布可能有差异,暗示周末小费比例不同
# - 点的大小(用餐人数)也影响小费金额,人数多的小费绝对值更高
# - 使用whitegrid样式和husl配色,图表清晰美观,便于识别模式和异常值