如何在 3x2 子图中创建单列 3x1 图?

问题描述 投票:0回答:1

我想创建一个有 2 列的图,第一个只有 1 个图,第二个有 3 个图。我尝试使用以下代码来设置它

import matplotlib.pyplot as plt

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()
ax1 = plt.subplot(222)
ax2 = plt.subplot(224)
ax3 = plt.subplot(121)
axes = [ax1, ax2, ax3]
format_axes(fig)
plt.tight_layout()
plt.show()

但是后来我很难制作第四个图,因为子图不支持索引> 5,而且我不知道如何使每个图的图形大小满足给定的比例。

我使用下面的代码再次尝试使用 gridspec

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(layout="constrained")

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

plt.show()

但是,我的问题再次出现,因为我无法操纵每个图的大小。

是否有一种通用方法可以为更大的 nrows x ncols 子图制作列大小图?有人可以为我解释一下 gridspec,我从 matplotlib.org 复制了代码并更改了一些值。

python matplotlib subplot
1个回答
0
投票

不确定您想要实现哪种布局,但如果您是新手,我认为

plt.subplot_mosaic
可能更容易,使用
height_ratios
widths_ratios
更改轴大小。

import matplotlib.pyplot as plt


fig, axd = plt.subplot_mosaic(
    """
    AB
    AC
    AD
    """,
    constrained_layout=True,
    gridspec_kw={
        "height_ratios": [1, 3, 2],
        "width_ratios": [1, 2],
    },
)

# axd is a dict of Axes, e.g. use axd["A"]

def label_axes(axd):
    for ax_name, ax in axd.items():
        ax.text(0.5, 0.5, ax_name, va="center", ha="center")
        ax.tick_params(labelbottom=False, labelleft=False)

label_axes(axd)

fig.show()

subplot mosaic layout

© www.soinside.com 2019 - 2024. All rights reserved.