强基初中数学&学Python——第269课 数字和数学第三方模块Matplotlib之七:封装端-在图表中排列多个图表域(3)

嵌套图表域布局Nested Axes layouts

  有时,需要两个或多个可能不需要相互关联的图表域(Axes)网格。实现这一点最简单的方法是使用子图表(Figure.subfigures)。请注意,子图表布局(subfigure layouts)是独立的,因此每个子图(subfigure)中的图表域框架(Axes spines)不一定对齐。有关实现相同效果的其它方法,详情请参见GridSpecFromSubplotSpec

  完整代码与运行结果:

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

ipython%matplotlib tkimport matplotlib.pyplot as plt
fig = plt.figure(layout="constrained")subfigs = fig.subfigures(1, 2, wspace=0.07, width_ratios=[1.5, 1.])axs0 = subfigs[0].subplots(2, 2)subfigs[0].set_facecolor('0.9')subfigs[0].suptitle('subfigs[0]\nLeft side')subfigs[0].supxlabel('xlabel for subfigs[0]')
axs1 = subfigs[1].subplots(3, 1)subfigs[1].suptitle('subfigs[1]')subfigs[1].supylabel('ylabel for subfigs[1]')

 

 

  也可以通过嵌套列表(nested lists)来使用subplot_mosaic实现嵌套图表域(nest Axes)。这种方法不像上面那样使用子图表(subfigures),因此缺乏添加每个子图的suptitle和supxlabel等的能力。实际上,如下面的代码,它只是subgridspec方法的一个方便包装器。

  完整代码与运行结果:

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

· 

ipython%matplotlib tkimport matplotlib.pyplot as plt
def annotate_axes(ax, text, fontsize=18):    ax.text(0.5, 0.5, text, transform=ax.transAxes,            ha="center", va="center", fontsize=fontsize, color="darkgrey")            inner = [['innerA'],         ['innerB']]outer = [['upper left',  inner],          ['lower left', 'lower right']]
fig, axd = plt.subplot_mosaic(outer, layout="constrained")for k in axd:    annotate_axes(axd[k], f'axd["{k}"]')

 

Figure.subfigures:

https://matplotlib.org/stable/api/figure_api.html#matplotlib.figure.Figure.subfigures
GridSpecFromSubplotSpec:https://matplotlib.org/stable/api/_as_gen/matplotlib.gridspec.GridSpecFromSubplotSpec.html#matplotlib.gridspec.GridSpecFromSubplotSpec
subplot_mosaic:https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.subplot_mosaic.html#matplotlib.pyplot.subplot_mosaic
subgridspec:https://matplotlib.org/stable/api/_as_gen/matplotlib.gridspec.SubplotSpec.html#matplotlib.gridspec.SubplotSpec.subgridspec