楼主: 汪文菁
26 0

[作业] Seaborn进阶:精通热力图、箱线图、分类散点图(附实战案例) [推广有奖]

  • 0关注
  • 0粉丝

等待验证会员

学前班

40%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
20 点
帖子
1
精华
0
在线时间
0 小时
注册时间
2018-8-22
最后登录
2018-8-22

楼主
汪文菁 发表于 2025-12-11 18:24:10 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

一、掌握Seaborn三大核心图表的必要性

在Python数据可视化领域,Seaborn凭借其简洁优雅的绘图风格,成为Matplotlib之上的高效封装工具。它不仅能够快速生成高质量图表,还天然支持Pandas数据结构,极大提升了分析效率。其中,热力图、箱线图与分类散点图是进阶分析中使用频率最高的三类图表:

  • 热力图:适用于展现变量之间的相关性或矩阵型数据分布,常用于特征选择、用户行为模式挖掘等场景;
  • 箱线图:擅长揭示数据的整体分布形态及异常值位置,是数据清洗和统计诊断的重要手段;
  • 分类散点图:有效解决传统散点图在分类数据上的重叠问题,更清晰地呈现分组特征。

本文将从底层原理出发,结合可运行代码与实际应用案例,全面解析这三类图表的绘制技巧,并覆盖常见痛点如中文显示、样式定制与数据适配等问题。

二、环境配置与数据准备

2.1 环境安装与验证

建议使用Python 3.8及以上版本,确保以下库已安装并更新至最新:

pip install seaborn pandas numpy matplotlib -U

执行如下代码验证环境是否就绪:

import seaborn as sns
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

print("Seaborn版本:", sns.__version__)

# 加载内置示例数据集(无需手动下载)
tips = sns.load_dataset("tips")
iris = sns.load_dataset("iris")
flights = sns.load_dataset("flights")

print("数据加载成功!")

2.2 基础设置(解决中文与负号显示)

为避免重复编码,统一设置全局绘图参数:

# 设置图形风格与调色板
sns.set_style("whitegrid")  # 可选:darkgrid, white, ticks, dark
sns.set_palette("husl")     # 推荐配色:husl, Set2, viridis, pastel

# 中文显示配置(根据操作系统选择)
plt.rcParams["font.sans-serif"] = ["SimHei"]  # Windows系统
# plt.rcParams["font.sans-serif"] = ["PingFang SC"]  # Mac系统
# plt.rcParams["font.sans-serif"] = ["WenQuanYi Micro Hei"]  # Linux系统

# 负号正常显示
plt.rcParams["axes.unicode_minus"] = False

# 图像分辨率设置
plt.rcParams["figure.dpi"] = 100

三、热力图的应用:洞察数据关联与分布规律

3.1 核心应用场景

热力图主要用于以下两类分析任务:

  • 相关性矩阵展示:识别变量间的线性关系强度,例如销售额与广告投入的相关程度;
  • 矩阵形式的数据分布:如不同年份各月份的航班客流变化、用户活跃时段频次统计等。

3.2 实战案例1:特征相关性热力图(以鸢尾花数据集为例)

通过iris数据集分析花瓣与花萼尺寸之间的相关性:

# 1. 提取数值型字段并计算皮尔逊相关系数
iris_corr = iris[["sepal_length", "sepal_width", "petal_length", "petal_width"]].corr()

# 2. 绘制热力图
plt.figure(figsize=(8, 6))
heatmap = sns.heatmap(
    iris_corr,
    annot=True,           # 在格子内显示数值
    fmt=".2f",            # 数值保留两位小数
    cmap="RdBu_r",        # 使用红蓝反向配色(正相关为红,负相关为蓝)
    vmin=-1, vmax=1,      # 固定颜色映射范围为[-1,1]
    linewidths=0.5,       # 单元格边框宽度
    cbar_kws={"label": "相关系数"}  # 颜色条标注
)

# 3. 添加标题并优化布局
plt.title("鸢尾花特征相关性热力图", fontsize=14, pad=20)
plt.tight_layout()
plt.savefig("iris_corr_heatmap.png", dpi=300, bbox_inches="tight")
plt.show()

关键参数说明:

annot=True

必须启用annot=True,否则仅靠颜色难以准确判断数值大小,削弱图表分析价值;

cmap

常用色彩方案包括:

RdBu_r
(适合相关性分析)、
YlGnBu
(适合一般数值分布)、
viridis
(通用美观);
vmin/vmax

设定固定颜色区间,有助于多图对比时保持视觉一致性。

3.3 实战案例2:时间序列矩阵热力图(航班客流量分析)

利用flights数据集,展示1949年至1960年间每月国际航班乘客数量的变化趋势:

一、数据重塑与热力图可视化:航班客流量分析

首先对航班数据进行格式转换,将原始的长格式数据通过 pivot 操作转为宽格式,其中行索引为年份,列对应月份,单元格值为乘客数量:

flights_pivot = flights.pivot(index="year", columns="month", values="passengers")

随后使用 Seaborn 绘制热力图以直观展示时间维度上的客流变化模式:

plt.figure(figsize=(10, 8)) sns.heatmap( flights_pivot, annot=True, fmt="d", cmap="YlGnBu", linewidths=0.2, cbar_kws={"orientation": "horizontal", "pad": 0.1} )

在图形样式方面进行了优化设置:

plt.title("1949-1960年各月份航班客流量热力图", fontsize=14, pad=20) plt.xlabel("月份", fontsize=12) plt.ylabel("年份", fontsize=12) plt.tight_layout() plt.show()

观察结论

  • 每年7月至8月夏季期间,航班客流量达到年度高峰;
  • 整体来看,客流量随年份呈持续上升趋势;
  • 最高值出现在1960年12月,形成整个时间段内的峰值。

二、箱线图应用:揭示数据分布特征与异常值检测

箱线图是一种基于五数概括法的统计图表,能够有效反映数据的分布情况和潜在离群点。其核心构成包括:

  • 下须:Q1 - 1.5×IQR(IQR = Q3 - Q1,即四分位距);
  • Q1(第一四分位数):数据中25%位置的数值;
  • 中位数:第50%分位数,代表数据中心位置;
  • Q3(第三四分位数):数据中75%位置的数值;
  • 上须:Q3 + 1.5×IQR;
  • 超出上下须的点:被视为异常值,需进一步核查原因。

实战案例1:不同时段小费金额分布对比

利用箱线图分析不同用餐时段的小费金额,并引入性别作为分组变量:

plt.figure(figsize=(8, 6)) sns.boxplot( data=tips, x="time", y="tip", hue="sex", palette="Set2", linewidth=1.2 )

添加标题与标签并调整布局:

plt.title("不同用餐时段/性别的小费金额分布", fontsize=14, pad=20) plt.xlabel("用餐时段", fontsize=12) plt.ylabel("小费金额(美元)", fontsize=12) plt.legend(title="性别", loc="upper right") plt.tight_layout() plt.show()

分析发现

  • 晚餐时段的小费中位数明显高于午餐;
  • 男性顾客在晚餐时存在若干高额小费记录,属于显著异常值,可能源于特殊消费场景或数据录入问题;
  • 午餐时段中,男女之间的小费分布差异较小,趋于一致。

实战案例2:多类别分组下的花瓣长度比较

针对鸢尾花数据集,绘制不同物种的花瓣长度箱线图:

plt.figure(figsize=(10, 6)) sns.boxplot( data=iris, x="species", y="petal_length", palette="viridis", flierprops={"marker": "x", "color": "red"} )

为进一步增强可视化效果,叠加散点层以呈现原始观测值:

sns.stripplot( data=iris, x="species", y="petal_length", color="black", size=2, alpha=0.5 ) plt.title("不同物种鸢尾花的花瓣长度分布", fontsize=14) plt.xlabel("鸢尾花物种", fontsize=12) plt.ylabel("花瓣长度(cm)", fontsize=12) plt.show()

进阶建议:将箱线图与散点图结合使用,既能体现统计摘要信息,又能保留个体数据点的位置,适用于科研报告或数据分析文档中的高质量图表展示。

三、分类散点图:缓解类别型数据重叠问题

传统散点图在处理分类变量时容易出现数据点堆叠现象,影响分布判断。Seaborn 提供了三种有效的解决方案来应对该问题:

stripplot
swarmplot
catplot

5.1 stripplot:带抖动的散点图

通过引入随机水平扰动(jitter),使原本重合的数据点分散开来,提升可读性,尤其适合样本量较大的情况:

plt.figure(figsize=(8, 6)) sns.stripplot( data=tips, x="day", y="total_bill", hue="smoker", jitter=0.2, palette="Set1", size=4 ) plt.title("不同星期/吸烟状态的消费金额分布", fontsize=14)

# 3.3:分类散点图(分析不同城市等级的客单价)
g = sns.catplot(
    data=df,
    x="城市等级",
    y="客单价",
    hue="用户等级",
    kind="strip",
    palette="husl",
    height=6,
    aspect=0.9
)
g.set_xlabels("城市等级", fontsize=12)
g.set_ylabels("客单价(元)", fontsize=12)
g.fig.suptitle("不同城市等级与用户等级下的客单价分布", y=1.02, fontsize=14)
plt.tight_layout()
plt.show()

# 3.4:蜂群图(展示各用户群体的消费频次分布)
plt.figure(figsize=(9, 6))
sns.swarmplot(
    data=df,
    x="用户等级",
    y="消费频次",
    hue="城市等级",
    palette="Set1",
    size=5,
    alpha=0.8
)
plt.title("不同用户等级的消费频次分布(蜂群图)", fontsize=14)
plt.xlabel("用户等级", fontsize=12)
plt.ylabel("消费频次(次)", fontsize=12)
plt.legend(title="城市等级", bbox_to_anchor=(1.05, 1), loc='upper left')
plt.tight_layout()
用户ID,消费金额,消费频次,用户等级,城市等级
1001,298,3,VIP,一线
1002,89,1,普通,三线
1003,599,5,VIP,一线
1004,199,2,普通,二线
1005,399,4,高级,二线
1006,159,2,普通,三线
1007,899,6,VIP,一线
1008,99,1,普通,三线
1009,499,4,高级,二线
1010,699,5,VIP,一线
# 3.5:分面分类图(多维度消费行为对比) g = sns.catplot( data=df, x="用户等级", y="消费金额", col="城市等级", # 按城市等级拆分为多个子图 kind="box", palette="coolwarm", height=5, aspect=0.8 ) g.set_xlabels("用户等级", fontsize=12) g.set_ylabels("消费金额(元)", fontsize=12) g.set_titles("{col_name}城市") g.fig.suptitle("各城市等级下不同用户群体的消费金额箱线图", y=1.02, fontsize=14) plt.tight_layout() plt.show() # 3.6:小提琴图(展示客单价在性别与用户等级间的分布) plt.figure(figsize=(10, 7)) sns.violinplot( data=df, x="用户等级", y="客单价", hue="性别", split=True, inner="quart", palette="Pastel1" ) plt.title("不同性别与用户等级的客单价分布(小提琴图)", fontsize=14) plt.xlabel("用户等级", fontsize=12) plt.ylabel("客单价(元)", fontsize=12) plt.legend(title="性别") plt.tight_layout()
kind
六、实战整合:电商用户消费行为分析 6.1 模拟数据说明 本案例使用模拟生成的用户行为数据,包含用户等级、城市等级、性别、消费金额、消费频次等字段,用于全面分析用户消费特征。原始数据已保存为 user_behavior.csv 文件。 6.2 完整分析流程代码实现 import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 1. 数据读取与基础处理 df = pd.read_csv("user_behavior.csv") # 计算衍生变量:客单价 df["客单价"] = df["消费金额"] / df["消费频次"] # 2. 可视化全局设置 sns.set_style("whitegrid") plt.rcParams["font.sans-serif"] = ["SimHei"] # 支持中文显示 plt.rcParams["axes.unicode_minus"] = False # 正常显示负号 # 3.1 相关性热力图(数值型变量间关系分析) corr = df[["消费金额", "消费频次", "客单价"]].corr() plt.figure(figsize=(7, 5)) sns.heatmap(corr, annot=True, fmt=".2f", cmap="RdBu_r", linewidths=0.5) plt.title("消费相关指标的相关性热力图", fontsize=14) plt.tight_layout() plt.show()
subplots
5.3 catplot:分类图表的一站式解决方案 Seaborn 中的
catplot
是一个高度集成的分类绘图函数,可通过设置
kind
参数灵活切换图表类型(如 strip、swarm、box、violin 等),并天然支持多子图布局,极大提升可视化效率。 示例:按用餐时段拆分子图,分析星期、吸烟状态对消费的影响 g = sns.catplot( data=tips, x="day", y="total_bill", hue="smoker", col="time", # 拆分为午餐和晚餐两个子图 kind="swarm", # 使用蜂群图展示分布 palette="Set2", height=5, aspect=0.8 ) g.fig.suptitle("不同用餐时段/星期/吸烟状态的消费分布", y=1.02, fontsize=14) g.set_xlabels("星期", fontsize=12) g.set_ylabels("总消费(美元)", fontsize=12) plt.tight_layout() plt.show() 主要优势:
catplot
能够统一管理多维度分组与子图结构,避免重复调用 plt.subplots 或循环绘图,显著简化代码逻辑与维护成本。 5.2 swarmplot(蜂群图) 该图表确保数据点互不重叠,依据数值大小紧密排列,适合样本量较小的数据集(大数据易造成视觉拥堵): plt.figure(figsize=(10, 6)) sns.swarmplot( data=iris, x="species", y="sepal_width", hue="species", palette="husl", size=5 ) plt.title("不同物种鸢尾花的花萼宽度分布(蜂群图)", fontsize=14) plt.xlabel("鸢尾花物种", fontsize=12) plt.ylabel("花萼宽度(cm)", fontsize=12) plt.legend().remove() # 避免图例重复 plt.show() 适用场景:适用于实验测量值、调查问卷等小规模分类数据,需精确呈现每个观测点位置的情形。 核心参数说明: 抖动强度控制是关键,若设为0,则点完全对齐,失去抖动意义;若设为1,则抖动达到最大幅度。
jitter

七、新手常见问题与解决方案

热力图数值显示不全:可通过调整画布大小来解决,如增大画布尺寸;也可通过减小数值标签的字体大小,确保内容完整呈现。

figsize
fontsize

箱线图异常值过多:首先应检查原始数据是否存在极值或缺失值等异常情况。若数据无误,可考虑手动调整IQR(四分位距)范围,以优化异常值的识别逻辑。

蜂群图点过于密集或出现报错:当数据量较大时,建议改用其他更适合大数据集的可视化方式;也可通过对X轴或Y轴进行数据筛选,减少绘制点的数量,缓解拥挤问题。

stripplot
x
y

中文标签被截断:在绘图时添加适当的布局参数,如使用tight_layout(),或在保存图像时设置bbox_inches='tight',可有效避免标签裁剪问题。

plt.tight_layout()
bbox_inches="tight"

八、进阶学习方向

自定义图表样式:利用相关参数配置,可灵活调整图表的分辨率、字体大小及整体风格,适用于不同展示场景(如paper、talk、poster、notebook等模式)。

seaborn.set_context()

组合图表设计:将多种图表类型结合使用,例如在箱线图基础上叠加折线趋势,或在热力图中添加数值标注,有助于提升信息表达的密度与直观性。

交互式热力图开发:借助Plotly等支持交互功能的可视化库,可实现鼠标悬停查看详细数值的效果,增强用户体验与数据探索能力。

批量生成图表:通过编写循环结构自动遍历多个维度,实现多图表的快速输出,特别适用于需要生成大量分析图表的报告场景。

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Born 箱线图 散点图 abo Sea

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-22 06:06