多图网格的使用
学习并理解为何使用多图网格是数据可视化中的合适选择。
简单来说,多图网格(也称为小倍数)是一种由多个图表组成的网格。该网格的大小和形状可根据数据需求灵活调整,网格内的图表也可以根据具体要求进行变化。当需要针对同一(或不同)变量在数据的不同子集上绘制多个相同或不同的图表时,多图网格就显得非常有用。它们有助于从数据中提取复杂的模式,是快速传达简洁而有意义信息的绝佳选择。
下面我们来看几个使用多图网格会非常有帮助甚至至关重要的场景。例如,假设我们有一个包含大量特征的大规模数据集,任务是基于这些数据训练多个机器学习模型并报告最终结果。在这种高维数据上训练多个模型在空间和时间复杂度上都会非常昂贵。处理高维数据有许多方法,其中一种可行方案是可视化不同变量之间的关系,以判断哪些特征提供了关键信息,哪些可能是冗余的。
通过在网格中可视化变量,我们可以对不同变量之间的关系有一个整体把握。例如,在下图中,我们展示了 seaborn 的 diamonds 数据集中的多个特征。通过多图网格,我们对不同钻石切工下的 price(价格)、table(台面)和 depth(深度)等特征进行了分析。
另一个适用多图网格的场景是,当我们希望比较不同数学函数(如 、、 等)在给定函数 下的表现时。例如,下图展示了函数 在 与 不同情况下的行为对比。注意每个子图都有独立的主题和绘图风格。这正是多图网格的优势所在——它允许在同一张图中共存多种不同的样式主题和风格。
此外,当可视化本身非常复杂,需要多个图表协同呈现时,多图网格也极为有用。Seaborn 提供了灵活组合多种图表的能力,如 relplot()、histplot()、jointplot() 等。但有时我们的可视化结构较为复杂,此时多图网格便能发挥重要作用。它允许我们根据需求自定义网格的形状和大小,构建专属的布局,并在其中绘制不同的图表,从而发现数据中有趣的模式。
例如,在下图中,我们定义了一个自定义的网格空间,包含五个不同尺寸的子区域,每个区域都配有独特的 seaborn 可视化图表。这样,我们可以将多种可视化方式融合在一起,全面展示数据的整体特征,比如:各变量之间的关联性、分布形态、是否存在冗余特征等。
我们可以通过 seaborn 和 matplotlib 库提供的以下三种类和函数来创建多图网格:
- seaborn 的
FacetGrid类 - seaborn 的
PairGrid类 - matplotlib 的
subplots配合gridspec
seaborn 的 FacetGrid 类用于创建子图网格,这些子图针对同一变量,但按另一个分类变量的不同水平进行划分。每个子图代表一种随三个维度之一(col、row、hue)变化的关系。
类似地,seaborn 的 PairGrid 类也用于绘制多个子图,与 FacetGrid 不同的是,FacetGrid 在同一变量上绘制相同的图表类型,而 PairGrid 的每个子图则表示不同变量之间的独特关系。需要注意的是,配对网格的上下三角区域互为镜像,仅坐标轴位置互换。
最后,我们还可以使用 matplotlib 的 subplots 和 gridspec。通过 subplots 创建图形和坐标轴,再用 gridspec 定义网格空间。这种网格空间可以是任意形状和大小,不局限于正方形布局。我们可以在该空间内同时使用 matplotlib 和 seaborn 的绘图函数。
创建多图网格的决策取决于多个因素,包括:
- 我们拥有的数据类型
- 我们的最终目标
- 可视化的复杂程度
- 我们希望在可视化中观察到的关系类型
- 我们希望从数据中提取的模式类型
- 目标受众理解可视化内容的能力