我有如下的情节:
fig,ax = plt.subplots(5,2,sharex=True,sharey=True,figsize=fig_size)
现在我想给这个图标上常用的x轴和y轴标记。这里的“common”是指在整个子图网格的下方应该有一个大的x轴标签,在右侧应该有一个大的y轴标签。我在plt的文档中找不到任何关于这个的东西。我的谷歌搜索表明我需要做一个大的plot .subplot(111)来开始-但是我如何使用plot .subplots将我的5*2子图放入其中呢?
我有如下的情节:
fig,ax = plt.subplots(5,2,sharex=True,sharey=True,figsize=fig_size)
现在我想给这个图标上常用的x轴和y轴标记。这里的“common”是指在整个子图网格的下方应该有一个大的x轴标签,在右侧应该有一个大的y轴标签。我在plt的文档中找不到任何关于这个的东西。我的谷歌搜索表明我需要做一个大的plot .subplot(111)来开始-但是我如何使用plot .subplots将我的5*2子图放入其中呢?
当前回答
这看起来是你真正想要的。它将这个答案的相同方法应用到您的具体情况:
import matplotlib.pyplot as plt
fig, ax = plt.subplots(nrows=3, ncols=3, sharex=True, sharey=True, figsize=(6, 6))
fig.text(0.5, 0.04, 'common X', ha='center')
fig.text(0.04, 0.5, 'common Y', va='center', rotation='vertical')
其他回答
这看起来是你真正想要的。它将这个答案的相同方法应用到您的具体情况:
import matplotlib.pyplot as plt
fig, ax = plt.subplots(nrows=3, ncols=3, sharex=True, sharey=True, figsize=(6, 6))
fig.text(0.5, 0.04, 'common X', ha='center')
fig.text(0.04, 0.5, 'common Y', va='center', rotation='vertical')
没有sharex=True, sharey=True,你得到:
有了它,你应该得到更好的:
fig, axes2d = plt.subplots(nrows=3, ncols=3,
sharex=True, sharey=True,
figsize=(6,6))
for i, row in enumerate(axes2d):
for j, cell in enumerate(row):
cell.imshow(np.random.rand(32,32))
plt.tight_layout()
但是如果你想添加额外的标签,你应该只将它们添加到边缘图中:
fig, axes2d = plt.subplots(nrows=3, ncols=3,
sharex=True, sharey=True,
figsize=(6,6))
for i, row in enumerate(axes2d):
for j, cell in enumerate(row):
cell.imshow(np.random.rand(32,32))
if i == len(axes2d) - 1:
cell.set_xlabel("noise column: {0:d}".format(j + 1))
if j == 0:
cell.set_ylabel("noise row: {0:d}".format(i + 1))
plt.tight_layout()
为每个图添加标签会破坏它(也许有一种方法可以自动检测重复的标签,但我不知道)。
如果在左下角的子图中设置不可见的标签,为公共标签保留空间,看起来会更好。从rcParams中传入fontsize也很好。这样,公共标签将随着rc设置而改变大小,轴也将调整为公共标签留出空间。
fig_size = [8, 6]
fig, ax = plt.subplots(5, 2, sharex=True, sharey=True, figsize=fig_size)
# Reserve space for axis labels
ax[-1, 0].set_xlabel('.', color=(0, 0, 0, 0))
ax[-1, 0].set_ylabel('.', color=(0, 0, 0, 0))
# Make common axis labels
fig.text(0.5, 0.04, 'common X', va='center', ha='center', fontsize=rcParams['axes.labelsize'])
fig.text(0.04, 0.5, 'common Y', va='center', ha='center', rotation='vertical', fontsize=rcParams['axes.labelsize'])
因为我认为它足够相关和优雅(不需要指定坐标来放置文本),所以我复制了(稍加修改)另一个相关问题的答案。
import matplotlib.pyplot as plt
fig, axes = plt.subplots(5, 2, sharex=True, sharey=True, figsize=(6,15))
# add a big axis, hide frame
fig.add_subplot(111, frameon=False)
# hide tick and tick label of the big axis
plt.tick_params(labelcolor='none', which='both', top=False, bottom=False, left=False, right=False)
plt.xlabel("common X")
plt.ylabel("common Y")
结果如下(使用matplotlib 2.2.0版本):
Matplotlib v3.4新增功能(pip install Matplotlib—upgrade)
标签和标签
fig.supxlabel('common_x')
fig.supylabel('common_y')
看到的例子:
import matplotlib.pyplot as plt
for tl, cl in zip([True, False, False], [False, False, True]):
fig = plt.figure(constrained_layout=cl, tight_layout=tl)
gs = fig.add_gridspec(2, 3)
ax = dict()
ax['A'] = fig.add_subplot(gs[0, 0:2])
ax['B'] = fig.add_subplot(gs[1, 0:2])
ax['C'] = fig.add_subplot(gs[:, 2])
ax['C'].set_xlabel('Booger')
ax['B'].set_xlabel('Booger')
ax['A'].set_ylabel('Booger Y')
fig.suptitle(f'TEST: tight_layout={tl} constrained_layout={cl}')
fig.supxlabel('XLAgg')
fig.supylabel('YLAgg')
plt.show()
查看更多