在 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()
我需要在 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()