带有gridspec子批次的共享轴

2024-06-28 11:47:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用嵌套的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参数在每个集合中的所有四个轴上具有完全相同的比例(但是不同集合的比例不同)。在

我想避免重复标签和每个轴的刻度。我怎么才能做到呢?在


Tags: inimport网格formatplotlibasnpfig
1条回答
网友
1楼 · 发布于 2024-06-28 11:47:51

子批次轴具有is_{first,last}_{col,row}()(尽管我在任何地方都找不到文档),如this matplotlib tutorial所示。这些函数只适用于在正确位置打印标签和/或记号。要隐藏记号标签,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

相关问题 更多 >