【Python】在同一图形中更加优雅地绘制多个子图

1. 引言

数据可视化非常重要,有一句俗语叫做一图顶千言,我相信好多小伙伴应该都听说过这句话;即使是有人第一次听到,我想应该也会觉得赞成,这足以说明数据可视化的重要性。我们在前一篇博客中,介绍了如何利用subplot来在一张子图里绘制多个子图,最近我又发现了一种更加优雅地实现,迫不及待地想要和大家分享。

闲话少说,我们直接开始吧!

2. 举个栗子

为了更加便捷地实现在图一图像中绘制多个子图,这里我强烈安利subplot_mosaic()函数,它使得子图的布局更加灵活。我们不妨来直接看以下例子:
在这里插入图片描述

请注意,此时我们有3个子图。图A将在左上角占据一个位置;图 B 将在图的左下角占据一个位置;同时图C将在右侧的顶部和底部占据两个位置。现在,我们所要做的就是将其转换为Python实现,您会发现它非常简单。

3. 代码实现

我们使用matplotlib库中的函数subplot_mosaic实现上述功能,代码如下:

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# Data
df = sns.load_dataset('tips')
# Plot with Mosaic
fig = plt.figure(layout= 'constrained')
mosaic = fig.subplot_mosaic('''
                            ac
                            bc
                            ''')

# Plot A
mosaic['a'].bar(df.sex, df.tip, color='coral')
# Plot B
mosaic['b'].scatter(df.total_bill, df.tip, color='forestgreen')
# Plot C
mosaic['c'].boxplot(df.tip, patch_artist=True);

运行结果如下:
在这里插入图片描述

4. 代码分析

让我们仔细研究一下上述代码,我们首先开始创建一个figure,接着创建一个mosaic变量 , 其中函数subplot_mosaic的入参为字符串。注意,代码中使用ac bc的顺序和形状与上图相同。通过在右侧重复c两次来告诉matplotlib我们希望图c占据图形中的两个位置。其余代码只是常规的单个子图的创建代码。

我们可以打印一下mosaic 变量的值,可以看到如下:
{'a': <Axes: label='a'>, 'c': <Axes: label='c'>, 'b': <Axes: label='b'>}
因此,实质上我们调用subplot_mosaic函数返回了一个字典,剩下的就是需要常规的画出每个对应位置上的子图。

5. 改变布局

如果你看懂了上述代码,那么我们可以轻易的改变上述子图的布局。
代码如下:

# Plot with Mosaic
fig = plt.figure(layout= 'constrained', figsize=(12,6))
mosaic = fig.subplot_mosaic('''
                            aaa
                            bcc
                            ''')

# Plot A
mosaic['a'].bar(df.day, df.tip, color='coral')
# Plot B
mosaic['b'].boxplot(df.total_bill, patch_artist=True)
# Plot C
mosaic['c'].scatter(df.total_bill, df.tip, color='forestgreen');

结果如下:
在这里插入图片描述

6. 添加标题

如果我们需要对上述图表添加标题,该如何实现呢?实质上我们可以使用一行额外的代码为整个图像添加一个标题。

# Adding a single title to the mosaic

plt.suptitle('''        -- P L O T S --
                - Top Left: Sum of tips by Sex -
                - Bottom Left: Tip by Total Bill -
                - Right: Boxplot of Tips - ''')

结果如下:
在这里插入图片描述
什么?你希望对每个子图添加一个标题。由于mosaic为一个字典,那我们可以创建一个循环,通过遍历想要的key-value来实现。代码如下:

# Define Titles
titles = ['Sum of tips by Sex', 'Tip by Total Bill', 'Boxplot of Tips']

# One title per plot
for ax, g_title in zip(mosaic.items(), titles):
    ax[1].set_title(g_title, fontstyle='italic')

结果如下:
在这里插入图片描述

Wow,经过一步步美化,最后呈现的结果果然好看多了。

7. 总结

我相信在单个图形中绘制多个图形有助于对比和提升可视化效果的目的,拥有一种使其更简洁的方法会提升很大的效果,推荐大家多多使用。

您学废了嘛?

猜你喜欢

转载自blog.csdn.net/sgzqc/article/details/131274740