可以从 matplotlib 的图 class 实例中获取行数和列数吗?

Can one get the number of rows and columns from an instance of the Figure class from matplotlib?

问题:

假设有人想在一张图中放置 4 个子图 - 4 行 1 列,或 1 行 4 列。可以使用 fig, axes = plt.subplots(nrows=..., ncols=...) 来初始化这个子图。但是,输入 nrows=4, ncols=1 和输入 nrows=1, ncols=4 都会得到相同的 axes.shape=(4,)axes。由于这些形状相同,matplotlib 如何确定图形的行数和列数? 能否从figaxes的实例中获取nrowsncols

MWE:

如果以上内容不清楚,可以运行下面的代码来创建这样的子图(注意print语句):

import numpy as np
import matplotlib.pyplot as plt

## sample data
x = np.arange(10)
y1 = np.cos(x)
y2 = np.sin(x)
y3 = np.tan(x)
y4 = 1 / y3

## make easy to identify
labels = ('cos', 'sin', 'tan', r'$\frac{1}{tan}$')
facecolors = ('darkorange', 'steelblue', 'purple', 'green')

## initialize plot
# fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(12,7)) ## shape=(2,2)
fig, axes = plt.subplots(nrows=4, ncols=1, figsize=(12,7)) ## shape=(4,)
# fig, axes = plt.subplots(nrows=1, ncols=4, figsize=(12,7)) ## shape=(4,)

## verify shape of axes
print(axes.shape)

## create a plot
for ax, y, label, facecolor in zip(axes.ravel(), (y1, y2, y3, y4), labels, facecolors):
    ax.plot(x, y, label=label, color=facecolor)

## add legend
fig.subplots_adjust(bottom=0.2)
fig.legend(loc='lower center', mode='expand', fontsize=8, ncol=4)

## fig.nrows outputs AttributeError: 'Figure' object has no attribute 'nrows'.

## show and close
plt.show()
plt.close(fig)

的答案提到使用以下解决方案 - 但它输出错误:

for f in fig.get_children():
    print(f.colNum, f.rowNum)

# AttributeError: 'Rectangle' object has no attribute 'colNum'

我想可以迭代 try-except 循环来做到这一点,但我想知道是否有更简洁的方法。

当您调用 plt.subplots() 时,matplotlib 使用 GridSpec 来创建子图。除了用于创建初始轴的一个之外,图形本身可以有多个 GridSpec,因此您无法从图形本身获取 GridSpec,但可以从轴获取它:

fig, axes = plt.subplots(nrows=1, ncols=4) ## shape=(4,)
gs = axes[0].get_gridspec()
gs.nrows  # return  1
gs.ncols  # returns 4