matplotlib 颜色条扭曲了同一图形中的另一个子图

ar5n3qh5  于 2023-05-07  发布在  其他
关注(0)|答案(2)|浏览(169)

在下面的代码中,变量mat_store显示在中心轴上,然后折叠的条形图(跨矩阵的每个轴)显示在矩阵的顶部和侧面。我还想在图的底部显示矩阵的颜色条。

num_bins = mat_store.shape[0]
        fig = plt.figure(figsize=(16, 16))
        gs = fig.add_gridspec(3, 2,  width_ratios=(7, 2), height_ratios=(2, 7, 0.5),
                        left=0.1, right=0.9, bottom=0.1, top=0.9,
                        wspace=0.05, hspace=0.15)

        ax = fig.add_subplot(gs[1, 0])
        ax_histx = fig.add_subplot(gs[0, 0], sharex=ax)
        ax_histy = fig.add_subplot(gs[1, 1], sharey=ax)
        ax_histx.tick_params(axis="x", labelbottom=False)
        ax_histy.tick_params(axis="y", labelleft=False)
        
        abs_serial = jnp.abs(mat_store)
        cur_trial_dependence = jnp.sum(abs_serial,axis=0)
        pre_trial_dependence = jnp.sum(abs_serial,axis=1)
        ax_histx.bar(np.arange(num_bins)-0.5, cur_trial_dependence, align="edge",color='k',linewidth=0,width = 1)
        ax_histy.barh(np.arange(num_bins)-0.5, pre_trial_dependence, height = 1, align="edge",color='k',linewidth=0,alpha=0.25)
        ax_histy.get_xaxis().set_ticks([])
        ax_histx.get_yaxis().set_ticks([])
        ax_histx.tick_params(
            which='both',      # both major and minor ticks are affected
            bottom=False,      # ticks along the bottom edge are off
            top=False,         # ticks along the top edge are off
            labelbottom=False) # labels along the bottom edge are off
        ax_histy.tick_params(
            which='both',      # both major and minor ticks are affected
            left=False,
            right=False,
            labelbottom=False) # labels along the bottom edge are off
        max_value = jnp.max(abs_serial)
        hist = ax.imshow(mat_store,origin="lower",cmap="seismic",vmin=-max_value,vmax=max_value)
        ax.set_ylabel(r"$S_{n-1}$")
        ax.set_xlabel(r"$S_{n}$")
        ax.set_title(r"$\langle \{S_{n-1},S_{n}\} \rangle - \langle S_{n} \rangle$")
        
        ax.set_yticks([0,num_bins-1])
        ax.set_yticklabels([r"$-\pi$",r"$\pi$"])
        ax.set_xticks([0,num_bins-1])
        ax.set_xticklabels([r"$-\pi$",r"$\pi$"])
        ax.plot([0,num_bins-1],[0,num_bins-1],color="white",ls="--",lw=2)
        ax.axvline((num_bins-1)/2,color="white",ls="--",lw=2)
        ax.axhline((num_bins-1)/2,color="white",ls="--",lw=2)
        col_ax = fig.add_subplot(gs[2, 0])
        fig.colorbar(hist,cax = col_ax,orientation="horizontal")

生成此图像

正如你所看到的,有几个问题。
1.我想向下移动颜色条,这样它就不会遮挡轴标签,同时也不会向上移动顶部的条形图,所以简单地修改add_gridspec中的hspace参数在这里是不合适的。移动轴标签(为了一致性,也可以垂直移动)也可以,但我也不知道如何操作。
1.更大的问题是,为什么在gridspec中添加axtra轴会使中心轴缩小?如果我没有第三行,矩阵将与顶行中的条形图完全对齐。为什么添加第三行会改变中轴的宽度?为什么不修改最上面的一行呢?我如何修复这个问题,使所有子图的边缘都对齐?

编辑

使坐标轴可定位也是一种技巧。编辑后的代码如下

num_bins = mat_store.shape[0]
        fig = plt.figure(figsize=(16, 16))
        gs = fig.add_gridspec(3, 2,  width_ratios=(7, 2), height_ratios=(2, 7, 0.5),
                        left=0.1, right=0.9, bottom=0.1, top=0.9,
                        wspace=0.05, hspace=0.15)

        ...
        
        divider = make_axes_locatable(ax)
        cax = divider.new_vertical(size="5%", pad=0.7, pack_start=True)
        fig.add_axes(cax)
        fig.colorbar(hist,cax = cax,orientation="horizontal")


但是正如你所看到的,主轴仍然缩小了,尽管至少颜色条现在与它一致。此外,右手轴跨越整个两个子图,而不仅仅是中心矩阵。我试过使用gridspec(2,2,...),但没有效果。

c86crjj0

c86crjj01#

您可以像在fig.colorbar(hist,cax = col_ax,orientation="horizontal", pad=0.2)中那样使用pad参数。这将修改颜色条的位置。

knsnq2tg

knsnq2tg2#

解决了!设置figsize=(16,16)是将图形压扁,这意味着中心矩阵,为了保持正方形,正在变小。把它改成figsize=(16,17.55)救了我。为了在轴上移动标题,我使用了labelpad参数。

相关问题