Python 数据分析与机器学习入门 (六):Seaborn 可视化技巧,图表更美观
引言:Matplotlib 与 Seaborn 的关系
在上一篇文章中,我们学习了 Matplotlib,它是 Python 数据可视化的基石,提供了强大的底层绘图能力和极高的定制自由度。然而,要用 Matplotlib 创建出既美观又包含复杂统计信息(如置信区间、分布密度)的图表,往往需要编写大量的代码。
Seaborn 的出现正是为了解决这一问题。它是一个构建在 Matplotlib 之上的高级可视化库。Seaborn 并非要取代 Matplotlib,而是作为其强大的补充。
你可以将它们的关系想象成这样:如果 Matplotlib 是一个让你能精确控制每一个像素的绘图工具箱,那么 Seaborn 就是一套为常用统计图形设计的精美模板。它能让你用更少的代码、更直观的 API,轻松创建出信息丰富且视觉上更吸引人的图表。
下表清晰地对比了两者的特点:
特性 | Matplotlib | Seaborn |
---|---|---|
抽象层次 | 低层次,命令式(控制每个细节) | 高层次,声明式(声明你想要什么) |
主要用途 | 基础绘图,完全定制 | 统计数据可视化,快速探索 |
易用性 | 复杂图表代码量大,学习曲线陡峭 | 常用统计图代码简洁,默认样式美观 |
数据格式 | 主要处理 NumPy 数组和列表 | 专为 Pandas DataFrame 设计 |
核心优势 | 极致的灵活性和精细控制 | 美观的默认设置,内置统计功能 |
Seaborn 的高级绘图函数
Seaborn 的一个核心设计理念是其函数与数据分析任务直接对应。例如,你想探索“两个变量间的关系”或“某个变量的分布情况”,Seaborn 都有专门的函数族来应对。Seaborn 函数的一大优点是能与 Pandas DataFrame
无缝集成,你只需指定 DataFrame
和列名即可。
关系图 (Relational Plots)
用于探索两个数值变量之间的关系。sns.scatterplot()
和 sns.lineplot()
是其中的代表。通过 hue
参数,可以轻松引入第三个分类变量,用颜色来区分数据点。
import seaborn as sns
import matplotlib.pyplot as plt# Seaborn 自带了一些示例数据集
tips = sns.load_dataset("tips")# 绘制散点图,探索总账单与小费的关系,并用是否吸烟区分颜色
sns.scatterplot(data=tips, x="total_bill", y="tip", hue="smoker")
plt.title('Total Bill vs. Tip by Smoker')
plt.show()
分布图 (Distribution Plots)
用于可视化单个变量的分布情况。sns.histplot()
(直方图) 和 sns.kdeplot()
(核密度估计图) 是最常用的两种。
# 绘制总账单的直方图,并叠加核密度估计曲线
sns.histplot(data=tips, x="total_bill", kde=True)
plt.title('Distribution of Total Bill')
plt.show()
分类图 (Categorical Plots)
这是 Seaborn 的一大特色,专门用于可视化一个数值变量与一个或多个分类变量之间的关系。这类图可以分为三个子类:
- 分类散点图:
sns.stripplot()
: 简单的散点图,可以用jitter
参数避免点重叠。sns.swarmplot()
: “蜂群图”,自动调整点的位置以避免重叠,能更好地展示分布。
- 分类分布图:
sns.boxplot()
: 箱形图,展示数据的五数概括(最小值、第一四分位数、中位数、第三四分位数、最大值)和异常点。sns.violinplot()
: 小提琴图,结合了箱形图和核密度估计,能更详细地展示数据的分布形态。
- 分类估计图:
sns.barplot()
: 条形图,展示每个分类的集中趋势估计值(默认为均值)和置信区间。sns.countplot()
: 计数图,展示每个分类的观测数量。
示例:使用箱形图比较每日小费的分布
sns.boxplot(data=tips, x="day", y="total_bill")
plt.title('Total Bill Distribution by Day')
plt.show()
图形级函数:relplot()
和 catplot()
的威力
Seaborn 的设计中有一个非常重要的概念:图形级 (Figure-level) 函数与坐标轴级 (Axes-level) 函数的区别。
- 坐标轴级函数: 如
scatterplot()
,boxplot()
等,它们在一个给定的 MatplotlibAxes
上绘图。这让你可以在一个Figure
上灵活地组合多个不同的图。 - 图形级函数: 如
relplot()
和catplot()
,它们是对应函数族的统一接口。它们会自己创建一个 MatplotlibFigure
和一个或多个Axes
,并管理整个图表的布局。
图形级函数的最大优势在于能够通过
col
和row
参数轻松创建分面网格 (faceted plots),即根据一个或两个分类变量的值,将数据拆分到不同的子图中进行展示。
示例:使用 relplot()
创建分面散点图
# 探索总账单与小费的关系,但按“时间”(午餐/晚餐) 分成两列子图,
# 并在每个子图内用“是否吸烟”区分颜色
sns.relplot(data=tips, x="total_bill", y="tip", col="time", hue="smoker")
plt.show()
这短短一行代码就创建了一个包含两个子图的复杂可视化,清晰地展示了四维数据(总账单、小费、时间、是否吸烟)之间的关系。如果用 Matplotlib 手动实现,代码量会大得多。
理解图形级和坐标轴级函数的区别,是从 Seaborn 初学者迈向高手的关键一步。 它决定了你是想在一个现成的画板上添一笔(使用坐标轴级函数),还是想让 Seaborn 帮你规划好一整套画廊(使用图形级函数)。
总结与展望
本篇我们探讨了 Seaborn 如何作为 Matplotlib 的高级封装,极大地简化了统计可视化的过程。我们学习了其核心的绘图函数类别,并重点理解了图形级函数(如 relplot
)和坐标轴级函数(如 scatterplot
)之间的关键区别。
至此,我们已经掌握了数据处理和可视化的核心工具。接下来,我们将进入本系列最激动人心的部分——机器学习。在下一篇文章中,我们将首先建立起对机器学习核心概念的理解,为后续的动手实践打下坚实的理论基础。