在 matplotlib 中垂直堆叠 4 个表

Vertically stack 4 tables in matplotlib

我需要在 matplotlib 中重新创建这个结构

import matplotlib.pyplot as plt

fig, (ax1, ax2, ax3, ax4) = plt.subplots(ncols=1, nrows=4)
# fig.tight_layout()
ax1.axis("off")
ax2.axis("off")
ax3.axis("off")
ax4.axis("off")

ax1.table(cellText=[["A", "B", "C", "D", "E", "F"]])

ax2.table(cellText=[[1, 1, 1, 1, 1, 1],
                    [2, 2, 2, 2, 2, 2],
                    [3, 3, 3, 3, 3, 3],
                    [4, 4, 4, 4, 4, 4],
                    [5, 5, 5, 5, 5, 5],
                    [6, 6, 6, 6, 6, 6],
                    [7, 7, 7, 7, 7, 7],
                    [8, 8, 8, 8, 8, 8],
                    [9, 9, 9, 9, 9, 9]])

ax3.table(cellText=[[1, 2, 3, 4, 5, 6],
                    [1, 2, 3, 4, 5, 6]])

ax4.table(cellText=[[1, 2, 3, 4, 5, 6]])

plt.show()

这是我目前所拥有的,但是 table 重叠并且无法使用。 所以我的问题是如何在 matplotlib 中实现这个 table 结构?

您 运行 遇到的问题是 subplots 假设您的所有 table 大小相同。由于情况并非如此,因此您最终会得到比底层 Axes 对象更大的 table。

如果您的情况已经提前准备好了 table,那么您可以根据行数估算它们的大小。您可以将此信息传递到 subplots 构造函数以按比例调整返回的轴的大小,以便每个 table 应该 适合它们自己的轴。

这里我预先定义了一个总体列表中的所有 table(主要是为了方便)。然后我可以获得每个 table 中的行数并将其传递给 height_ratios gridspec 参数,这样每个生成的 Axes 的大小与其各自的行数成正比table.

然后我可以用 tables 压缩返回的轴并实际插入值。

最后,您应该传递 loc='center',这样每个 table 实际上都被绘制到 Axes 而不是下面、上面或旁边。

import matplotlib.pyplot as plt

tables = [
    [["A", "B", "C", "D", "E", "F"]],

    [[1, 1, 1, 1, 1, 1],
     [2, 2, 2, 2, 2, 2],
     [3, 3, 3, 3, 3, 3],
     [4, 4, 4, 4, 4, 4],
     [5, 5, 5, 5, 5, 5],
     [6, 6, 6, 6, 6, 6],
     [7, 7, 7, 7, 7, 7],
     [8, 8, 8, 8, 8, 8],
     [9, 9, 9, 9, 9, 9]],

    [[1, 2, 3, 4, 5, 6],
     [1, 2, 3, 4, 5, 6]],

    [[1, 2, 3, 4, 5, 6]]
]

table_rows = [len(tbl) for tbl in tables]
fig, axes = plt.subplots(
    ncols=1, nrows=len(tables), 
    gridspec_kw={'height_ratios': table_rows}
)
for tbl, ax in zip(tables, axes.flat):
    ax.table(cellText=tbl, loc='center')
    ax.axis('off')

plt.show()