python matplotlib 画多图、子图

参考来源:
[1] https://matplotlib.org/3.5.3/tutorials/intermediate/arranging_axes.html

1. 添加多图方式

似乎一个 axes 就是一个图,所以文档里把这一类方法归为:arranging axes。

1.1 subfigure

fig = plt.figure(constrained_layout=True)
subfigs = fig.subfigures(1, 2, wspace=0.07, width_ratios=[1.5, 1.])

其中 constrained_layout 表示自动排版,自动调节边距,把 label 等内容都显示出来。
上面第二行创建两个子图,1 行 2 列排列,相距 0.01,宽度比例 3:2 。

1.2 添加格子 gridspec

添加格子以后,可以按格子添加 subplots

gs = fig.add_gridspec(nrows=3, ncols=3, left=0.05, right=0.75,
                      hspace=0.1, wspace=0.05)

上面这行创建 3x3 的格子,并且有左边距 0.05,右边距 0.75,格子之间纵向距离 0.1,横向距离 0.05。

1.3 subplots

ax0 = fig.add_subplot(gs[:-1, :])

创建一个 subplot,占 格子的 0,1,...,-1 行,所有列。

1.4 add_axes

add_axes
Adds a single axes at a location specified by [left, bottom, width, height] in fractions of figure width or height.
这个可以手动在一张大图里添加一张小图,自定义小图的大小。

2. 示例代码

从文档[1] 里抄几个代码,录在这里,方便查阅。

2.1 subfigure + subplots

fig = plt.figure(constrained_layout=True)
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]')

2.2 gridspec + subplots

fig = plt.figure(constrained_layout=False, facecolor='0.9')
gs = fig.add_gridspec(nrows=3, ncols=3, left=0.05, right=0.75,
                      hspace=0.1, wspace=0.05)
ax0 = fig.add_subplot(gs[:-1, :])
annotate_axes(ax0, 'ax0')
ax1 = fig.add_subplot(gs[-1, :-1])
annotate_axes(ax1, 'ax1')
ax2 = fig.add_subplot(gs[-1, -1])
annotate_axes(ax2, 'ax2')
fig.suptitle('Manual gridspec with right=0.75')

2.3 axes 调节

ax.spines.top.set_visible() 可以设置是否显示坐标轴。也许可以用来操作子图紧邻共享坐标轴的情况。

def squiggle_xy(a, b, c, d, i=np.arange(0.0, 2*np.pi, 0.05)):
    return np.sin(i*a)*np.cos(i*b), np.sin(i*c)*np.cos(i*d)

fig = plt.figure(figsize=(8, 8), constrained_layout=False)
outer_grid = fig.add_gridspec(4, 4, wspace=0, hspace=0)

for a in range(4):
    for b in range(4):
        # gridspec inside gridspec
        inner_grid = outer_grid[a, b].subgridspec(3, 3, wspace=0, hspace=0)
        axs = inner_grid.subplots()  # Create all subplots for the inner grid.
        for (c, d), ax in np.ndenumerate(axs):
            ax.plot(*squiggle_xy(a + 1, b + 1, c + 1, d + 1))
            ax.set(xticks=[], yticks=[])

# show only the outside spines
for ax in fig.get_axes():
    ss = ax.get_subplotspec()
    ax.spines.top.set_visible(ss.is_first_row())
    ax.spines.bottom.set_visible(ss.is_last_row())
    ax.spines.left.set_visible(ss.is_first_col())
    ax.spines.right.set_visible(ss.is_last_col())

plt.show()

posted on 2022-08-14 15:06  luyi07  阅读(906)  评论(0编辑  收藏  举报

导航