与gridspec子图共享轴

4

我正在使用嵌套的GridSpecFromSubplotSpec来创建一个嵌套的轴网格。我有两组独立的轴,一个顶部和一个底部。每组都有四个轴,排列在2x2的网格中。

这是我使用的代码和我得到的结果:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gsp

fig = plt.figure()
global_gsp = gsp.GridSpec(2, 1)

for i in range(2):
    axes = np.empty(shape=(2, 2), dtype=object)
    local_gsp = gsp.GridSpecFromSubplotSpec(2, 2, subplot_spec=global_gsp[i])

    for j in range(2):
        for k in range(2):
            ax = plt.Subplot(fig, local_gsp[j, k],
                             sharex=axes[0, 0], sharey=axes[0, 0])
            fig.add_subplot(ax)
            axes[j, k] = ax

    for j in range(2):
        for k in range(2):
            ax = axes[j, k]
            x = i + np.r_[0:1:11j]
            y = 10*i + np.random.random(11)
            ax.plot(x, y, color=f'C{i}')
            ax.set_xlabel('x')
            ax.set_ylabel('y')


plt.show()

Resulting figure

正如您所看到的,顶部设置有蓝色线条,底部设置有橙色线条,蓝色线条在限制[0, 1]x[0, 1]下被很好地表示,而橙色线条则在限制[1, 2]x[10, 11]下表示。当我使用plt.Subplot创建子图时,我使用sharexsharey参数在每个集合中的所有四个轴上具有完全相同的比例尺(但不同集合之间的比例尺不同)。
我希望避免每个轴的标签和刻度的重复。我该如何实现?
1个回答

7
subplot轴有函数is_{first,last}_{col,row}(),用于确定轴在网格中是首行、尾行、首列还是尾列(尽管我在任何地方都找不到文档)。如matplotlib教程所示,这些函数非常有用,可以将标签和/或刻度线放在正确的位置上。要隐藏刻度标签,shared_axis_demo.py建议使用setp(ax.get_{x,y}ticklabels(), visible=False)
fig = plt.figure()
global_gsp = gs.GridSpec(2, 1)

for i in range(2):
    axes = np.empty(shape=(2, 2), dtype=object)
    local_gsp = gs.GridSpecFromSubplotSpec(2, 2, subplot_spec=global_gsp[i])

    for j in range(2):
        for k in range(2):
            ax = plt.Subplot(fig, local_gsp[j, k],
                             sharex=axes[0, 0], sharey=axes[0, 0])
            fig.add_subplot(ax)
            axes[j, k] = ax

    for j in range(2):
        for k in range(2):
            ax = axes[j, k]
            x = i + np.r_[0:1:11j]
            y = 10*i + np.random.random(11)
            ax.plot(x, y, color=f'C{i}')


            #
            # adjust axes and tick labels here
            #
            if ax.is_last_row():
                ax.set_xlabel('x')
            else:
                plt.setp(ax.get_xticklabels(), visible=False)

            if ax.is_first_col():
                ax.set_ylabel('y')
            else:
                plt.setp(ax.get_yticklabels(), visible=False)


fig.tight_layout()
plt.show()

enter image description here


如果我理解正确,像我这样使用sharexsharey创建子图只能保证链接轴的限制相同,但不会关闭标签和刻度标签。另一方面,plt.subplots在创建网格时也会关闭这些内容。我的理解是,只有当所有轴同时创建时,matplotlib才会关闭标签。 - Spiros

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接