Синтаксис субплотов всегда был немного сложным
С этими звонками
ax0 = fig.add_subplot(221)
ax1 = fig.add_subplot(222)
Вы делите свою фигуру в сетке 2x2 и заполняете первый ряд.
ax2 = fig.add_subplot(313)
Теперь вы делите его на три строки и заполняете последний.
По сути, вы создаете две независимые сетки подзаговоров, и нет простого способа определить, как разнести подзаголовки из одного относительно другого.
Гораздо более простой и питонический способ - использовать gridspec
, чтобы создать единую более мелкую сетку и решить ее с помощью нарезки Python.
fig = plt.figure()
gs = mpl.gridspec.GridSpec(2, 2, wspace=0.25, hspace=0.25) # 2x2 grid
ax0 = fig.add_subplot(gs[0, 0]) # first row, first col
ax1 = fig.add_subplot(gs[0, 1]) # first row, second col
ax2 = fig.add_subplot(gs[1, :]) # full second row
И теперь вы также можете легко настроить интервалы с wspace
и hspace
.
Более сложные макеты также намного проще, это просто знакомый синтаксис нарезки.
fig = plt.figure()
gs = mpl.gridspec.GridSpec(10, 10, wspace=0.25, hspace=0.25)
fig.add_subplot(gs[2:8, 2:8])
fig.add_subplot(gs[0, :])
for i in range(5):
fig.add_subplot(gs[1, (i*2):(i*2+2)])
fig.add_subplot(gs[2:, :2])
fig.add_subplot(gs[8:, 2:4])
fig.add_subplot(gs[8:, 4:9])
fig.add_subplot(gs[2:8, 8])
fig.add_subplot(gs[2:, 9])
fig.add_subplot(gs[3:6, 3:6])
# fancy colors
cmap = mpl.cm.get_cmap("viridis")
naxes = len(fig.axes)
for i, ax in enumerate(fig.axes):
ax.set_xticks([])
ax.set_yticks([])
ax.set_facecolor(cmap(float(i)/(naxes-1)))