如何使用Matplotlib Mosaic增强您的可视化

Matplotlib 中我学到的最酷的方法之一

微笑!马赛克子图在这里!作者创建的图像。

介绍

数据可视化非常重要。我们可以从这句话中发展出很多,但我相信你已经有了“画面”。我相信这不是你第一次听到这个。即使是,我仍然认为这并不意外,对吧?

一张图胜过一千次观察。

如果一幅图像胜过一千个词,那么对于数据科学,我想说一幅图像胜过一千次观察。

无论如何,让我们转向这里的重点。这篇简短文章的目标是向您展示方法 subplot_mosaic() 。这个函数真是太棒了。最近我只是随便浏览和阅读一些与数据科学相关的内容时,就遇到了它。我对它的轻松创造多个图形的方式感到惊讶。

接下来让我们看看如何实现。

要使用的数据将是 Python 中 Seaborn 包中的原生数据集 Tips。

import pandas as pdimport matplotlib.pyplot as pltimport seaborn as sns# 数据df = sns.load_dataset('tips')

马赛克

在马赛克之前,有其他的方法来创建子图。它们并不难,但它们不像 subplot_mosaic() 方法那样灵活。您可以阅读下一篇文章了解我在说什么。

使用 Python 在同一图中绘制多个图形

学习如何在同一 matplotlib 图中绘制多个图形

towardsdatascience.com

马赛克方法给我们带来的最大贡献是灵活性,在非常少的代码中创建许多设计。看看下面的图像:如果我们现在想在 matplotlib 中复制它,我们将使用马赛克函数。

请注意,我们有 3 个图。 图 A 将占据左上角的一个位置。 图 B 将占据底部左侧的一个位置。 图 C 将占据右侧的上部和下部两个位置。因此,现在,我们所要做的就是将其翻译成 Python,你会发现真的很简单。

要在 matplotlib 中创建的马赛克。作者创建的图像。

让我们看看代码。我们首先创建一个图形,然后创建一个马赛克变量。马赛克变量可以采用列表或字符串。我认为使用三个引号的字符串并使用文本“绘制”最终绘图图像的样子会更容易。请注意,代码中使用的 ac bc 与前一个图的顺序和形状相同。通过在右侧两次重复 c,我告诉 matplotlib 我想要将图 C 放在图形的这两个位置上。其余的代码只是常规的图形创建代码。

如果你查看变量 mosaic,你会看到这个: {‘a’: <Axes: label=’a’>, ‘c’: <Axes: label=’c’>, ‘b’: <Axes: label=’b’>} 。因此,它创建了一个字典,我们现在只需要指定每个图形要放置的位置。

# 用马赛克绘制图形fig = plt.figure(layout= 'constrained')mosaic = fig.subplot_mosaic('''                            ac                            bc                            ''')# 绘制图 Amosaic['a'].bar(df.sex, df.tip, color='coral')# 绘制图 Bmosaic['b'].scatter(df.total_bill, df.tip, color='forestgreen')# 绘制图 Cmosaic['c'].boxplot(df.tip, patch_artist=True);

以下是可视化结果。

前面代码得到的马赛克图。图片由作者提供。

好的。希望我已经引起了你的注意。

我们可以创建不同的布局。看看这个。

# 使用马赛克图绘制plt.figure(layout= 'constrained', figsize=(12,6))mosaic = fig.subplot_mosaic('''                            aaa                            bcc                            ''')# 绘制Amosaic['a'].bar(df.day, df.tip, color='coral')# 绘制Bmosaic['b'].boxplot(df.total_bill, patch_artist=True)# 绘制Cmosaic['c'].scatter(df.total_bill, df.tip, color='forestgreen');
前面代码得到的马赛克图。图片由作者提供。

另外,这里还有一个更多图形的示例。

# 使用马赛克图绘制plt.figure(layout= 'constrained', figsize=(10,6))mosaic = fig.subplot_mosaic('''                            ab                            ac                            de                            ''')# 绘制Amosaic['a'].bar(df.day, df.tip, color='coral')# 绘制Bmosaic['b'].boxplot(df.total_bill, patch_artist=True)# 绘制Cmosaic['c'].scatter(df.total_bill, df.tip, color='forestgreen')# 绘制Dmosaic['d'].scatter(df.tip, df.total_bill, color='purple')# 绘制Emosaic['e'].scatter(df['size'], df.tip, color='gold');
前面代码得到的马赛克图。图片由作者提供。

设置标题

但是你可能会问:图表标题呢?

好问题,我想说!让我们学习如何放置它们。

第一个选项是最简单的:我们可以通过添加一行额外的代码为整个图像添加单个标题。

# 为马赛克图添加单个标题plt.suptitle('''        -- P L O T S --                - 左上:按性别求小费总数 -                - 左下:按总账单求小费 -                - 右侧:小费箱线图 - ''')
带有单个标题的马赛克图。图片由作者提供。

或者,我们可能希望为每个图添加一个标题。因此,让我们创建一个循环,遍历每个轴和标题列表中的每个标题,并逐个匹配它们。如果调用mosaic.items(),我们将看到字典和元组,就像之前展示的一样:(‘a’, <Axes: label=’a’>)。要设置标题,我们要访问元组中的第二个项Axes部分,这就是为什么我们在序列中使用ax[1]的代码片段。

下面是如何完成的。

# 定义标题titles = ['按性别求小费总数', '按总账单求小费', '小费箱线图']# 每个图一个标题for ax, g_title in zip(mosaic.items(), titles):    ax[1].set_title(g_title, fontstyle='italic')

这就是结果。

每个图都有一个标题的马赛克图。图片由作者提供。

非常好,不是吗?

在您离开之前

我相信在单个图中绘制多个图形可用于比较和演示目的。拥有一个使之变得更容易的方法会带来很大的差异。

记住以下步骤

  1. 创建一个图形
  2. 使用subplot_mosaic()创建一个mosaic变量,并使用三重引号将您的mosaic“绘制”出来。根据需要在mosaic的相应位置上多次写入每个图形标签。
  3. 使用plt.suptitle()或循环添加标题。

就这些了。

如果您喜欢这篇内容,请关注我获取更多内容。

也可以在领英上找到我。如果您正在考虑订阅小猪AI以阅读我的文章和更多内容,请考虑使用此推荐代码,因为这将激励我继续创作内容。

在小猪AI上阅读Gustavo Santos(以及成千上万的其他作家)的每个故事。您的会员费直接支持……

小猪AI.com

参考

matplotlib.pyplot.subplot_mosaic – Matplotlib 3.7.1文档

基于ASCII艺术或嵌套列表构建轴布局。这是构建复杂的GridSpec布局的辅助函数…

matplotlib.org

标记子图 – Matplotlib 3.7.1文档

标记子图相对简单,因为它有所不同,所以Matplotlib没有通用的处理方法…

matplotlib.org