大数跨境
0
0

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

【Python】在同一图形中更加优雅地绘制多个子图 AI算法之道
2023-06-18
0
导读:​我相信在单个图形中绘制多个图形有助于对比和提升可视化效果的目的,拥有一种使其更简洁的方法会提升很大的效果,推荐大家多多使用。






01


引言



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

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




02


准备工作


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

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






03


代码实现


我们使用matplotlib库中的函数subplot_mosaic实现上述功能。

代码如下:

import pandas as pdimport matplotlib.pyplot as pltimport seaborn as sns# Datadf = sns.load_dataset('tips')# Plot with Mosaicfig = plt.figure(layout= 'constrained')mosaic = fig.subplot_mosaic('''                            ac                            bc                            ''')
# Plot Amosaic['a'].bar(df.sex, df.tip, color='coral')# Plot Bmosaic['b'].scatter(df.total_bill, df.tip, color='forestgreen')# Plot Cmosaic['c'].boxplot(df.tip, patch_artist=True);

运行结果如下:







04


代码分析


让我们仔细研究一下上述代码,我们首先开始创建一个figure,接着创建一个mosaic变量 , 其中函数subplot_mosaic的入参为字符串。


注意,代码中使用ac bc的顺序和形状与上图相同。通过在右侧重复c两次来告诉matplotlib我们希望图c占据图形中的两个位置。其余代码只是常规的单个子图的创建代码。


顺便我们可以打印一下mosaic 变量的值,可以看到如下:

{'a': <Axes:label='a'>,'c': <Axes:label='c'>,'b': <Axes:label='b'>}


因此,实质上我们调用subplot_mosaic函数返回了一个字典,剩下的就是需要常规地画出每个对应位置上的子图。




05


改变布局



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

代码如下:

# Plot with Mosaicfig = plt.figure(layout= 'constrained', figsize=(12,6))mosaic = fig.subplot_mosaic('''                            aaa                            bcc                            ''')
# Plot Amosaic['a'].bar(df.day, df.tip, color='coral')# Plot Bmosaic['b'].boxplot(df.total_bill, patch_artist=True)# Plot Cmosaic['c'].scatter(df.total_bill, df.tip, color='forestgreen');

结果如下:






06


添加标题


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

# 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 Titlestitles = ['Sum of tips by Sex', 'Tip by Total Bill', 'Boxplot of Tips']
# One title per plotfor ax, g_title in zip(mosaic.items(), titles): ax[1].set_title(g_title, fontstyle='italic')

结果如下:

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







07


总结


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

您学废了嘛?






点击上方小卡片关注我






新年寄语:

所求皆如愿,

所行皆坦途。

多喜乐,长安宁。

【声明】内容源于网络
0
0
AI算法之道
一个专注于深度学习、计算机视觉和自动驾驶感知算法的公众号,涵盖视觉CV、神经网络、模式识别等方面,包括相应的硬件和软件配置,以及开源项目等。
内容 573
粉丝 0
AI算法之道 一个专注于深度学习、计算机视觉和自动驾驶感知算法的公众号,涵盖视觉CV、神经网络、模式识别等方面,包括相应的硬件和软件配置,以及开源项目等。
总阅读256
粉丝0
内容573