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