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

请注意,此时我们有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('''acbc''')# 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('''aaabcc''')# 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 mosaicplt.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
总结
您学废了嘛?
点击上方小卡片关注我
新年寄语:
所求皆如愿,
所行皆坦途。
多喜乐,长安宁。

