matplotlib 将gridspec与constrained_layout一起使用

dbf7pr2w  于 2023-03-19  发布在  其他
关注(0)|答案(1)|浏览(144)

我想用Python创建下面的图:

我使用下面的代码:

import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec

def format_axes(fig):
    for i, ax in enumerate(fig.axes):
        ax.text(0.5, 0.5, "ax%d" % (i+1), va="center", ha="center")
        ax.tick_params(labelbottom=False, labelleft=False)

fig = plt.figure(constrained_layout=True)

gs = GridSpec(3, 3, figure=fig)
ax1 = fig.add_subplot(gs[:2, 0])
ax2 = fig.add_subplot(gs[:2, 1:])
ax3 = fig.add_subplot(gs[-1, 1:])

fig.suptitle("GridSpec")
format_axes(fig)

plt.show()

但是我得到了以下警告:

UserWarning: constrained_layout not applied. At least one axes collapsed to zero width or height.

有谁知道怎么去掉这个警告吗?

6fe3ivhb

6fe3ivhb1#

  • constrained_layout* 是一个小错误,当有列的边距没有边缘的子图。例如,您的ax2和ax3包含两个网格列,并且没有轴定义两者之间的边界。这 * 是 * 一个已知的错误,如果它不存在的话会更好,但是...

但是,在这种情况下,最好使用width_ratiosheight_ratios,并使用您实际想要的2x2布局。一种现代的方法是使用subplot_mosaic,不过您也可以轻松地调整您的方法

import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec

def format_axes(axs):
    for k in axs:
        axs[k].text(0.5, 0.5, f"ax: {k}", va="center", ha="center")
        axs[k].tick_params(labelbottom=False, labelleft=False)

fig, axs = plt.subplot_mosaic([["A", "B"], [".", "C"]], constrained_layout=True,
                              gridspec_kw={'width_ratios':[1, 2],
                              'height_ratios':[2, 1]})
fig.suptitle("subplot_mosaic")
format_axes(axs)

使用旧式方法得到相同的结果,加上或减去标签:

fig = plt.figure(constrained_layout=True)
gs = fig.add_gridspec(2, 2, width_ratios=[1, 2], height_ratios=[2, 1])
ax1 = fig.add_subplot(gs[0, 0])
ax2 = fig.add_subplot(gs[0, 1])
ax3 = fig.add_subplot(gs[1, 1])

相关问题