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()