Python 缩小Matplotlib Gridspec中具有紧密_布局()的单个子地块之间的空间

Python 缩小Matplotlib Gridspec中具有紧密_布局()的单个子地块之间的空间,python,matplotlib,Python,Matplotlib,我正在使用matplotlib.gridspec和tight_layout()创建复杂的绘图布局。我当前的代码看起来像 import matplotlib.pyplot as plt import matplotlib.gridspec as gridspec import matplotlib from matplotlib.ticker import MaxNLocator fig = plt.figure(figsize=(15,15)) gs1 = gridspec.GridSpec(

我正在使用
matplotlib.gridspec
tight_layout()
创建复杂的绘图布局。我当前的代码看起来像

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import matplotlib
from matplotlib.ticker import MaxNLocator

fig = plt.figure(figsize=(15,15))
gs1 = gridspec.GridSpec(8, 2)

gs1.update(left=0.05, right=0.95, wspace=0.05, hspace=0.05)

ax1 = plt.subplot(gs1[0:4, 0]) # Original
ax2 = plt.subplot(gs1[0:4, 1]) # Model
ax3 = plt.subplot(gs1[4:8, 0]) # Residual+Sky
ax4 = plt.subplot(gs1[4:7, 1]) # SB profile
ax5 = plt.subplot(gs1[7:8, 1])# SB residuals

# Hide tick labels
plt.setp(ax1.get_yticklabels(), visible=False)
plt.setp(ax1.get_xticklabels(), visible=False)
plt.setp(ax2.get_yticklabels(), visible=False)
plt.setp(ax2.get_xticklabels(), visible=False)
plt.setp(ax3.get_yticklabels(), visible=False)
plt.setp(ax3.get_xticklabels(), visible=False)
plt.setp(ax4.get_xticklabels(), visible=False)

ax4.invert_yaxis()
ax4.set_ylabel(r'Surface Brightness, $\mu$ [mag arcsec$^{-2}$]')
ax5.set_ylabel(r'$\Delta\mu$')
ax5.set_xlabel('Semi-major Axis [arcsec]')
ax5.grid(b=True)
ax4.set_xscale('log')
ax5.set_xscale('log')

gs1.tight_layout(fig)

nbins = len(ax5.get_xticklabels())
ax5.yaxis.set_major_locator(MaxNLocator(nbins=nbins, prune='upper'))
ax4.yaxis.set_major_locator(MaxNLocator(nbins=nbins, prune='upper'))

# Show the plot
plt.show()
这将生成一个类似于

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import matplotlib
from matplotlib.ticker import MaxNLocator

fig = plt.figure(figsize=(15,15))
gs1 = gridspec.GridSpec(8, 2)

gs1.update(left=0.05, right=0.95, wspace=0.05, hspace=0.05)

ax1 = plt.subplot(gs1[0:4, 0]) # Original
ax2 = plt.subplot(gs1[0:4, 1]) # Model
ax3 = plt.subplot(gs1[4:8, 0]) # Residual+Sky
ax4 = plt.subplot(gs1[4:7, 1]) # SB profile
ax5 = plt.subplot(gs1[7:8, 1])# SB residuals

# Hide tick labels
plt.setp(ax1.get_yticklabels(), visible=False)
plt.setp(ax1.get_xticklabels(), visible=False)
plt.setp(ax2.get_yticklabels(), visible=False)
plt.setp(ax2.get_xticklabels(), visible=False)
plt.setp(ax3.get_yticklabels(), visible=False)
plt.setp(ax3.get_xticklabels(), visible=False)
plt.setp(ax4.get_xticklabels(), visible=False)

ax4.invert_yaxis()
ax4.set_ylabel(r'Surface Brightness, $\mu$ [mag arcsec$^{-2}$]')
ax5.set_ylabel(r'$\Delta\mu$')
ax5.set_xlabel('Semi-major Axis [arcsec]')
ax5.grid(b=True)
ax4.set_xscale('log')
ax5.set_xscale('log')

gs1.tight_layout(fig)

nbins = len(ax5.get_xticklabels())
ax5.yaxis.set_major_locator(MaxNLocator(nbins=nbins, prune='upper'))
ax4.yaxis.set_major_locator(MaxNLocator(nbins=nbins, prune='upper'))

# Show the plot
plt.show()

我需要做的是

  • 缩小ax4和ax5之间的垂直空间(两个右下角子批次),或

  • 使ax4和ax5共享相同的x轴,以便子批次之间的空间为零


  • 我非常喜欢
    gridspec
    tight_layout()
    格式化绘图的方式,但是我不知道如何“强制”各个子绘图之间的间距。使用
    matplotlib.gridspec
    tight_layout()
    是否有一种简单的方法来实现这一点

    可以使用axes实例的get_position和set_position方法来更改轴在图中的位置()

    get_position返回一个Bbox实例,您可以使用get_points获得一个2x2 numpy数组,其形式为[[x0,y0],[x1,y1]],其中x0,y0,x1,y1是轴的图形坐标

    import matplotlib.pyplot as plt
    import matplotlib.gridspec as gridspec
    import matplotlib
    from matplotlib.ticker import MaxNLocator
    
    fig = plt.figure(figsize=(15,15))
    gs1 = gridspec.GridSpec(8, 2)
    
    gs1.update(left=0.05, right=0.95, wspace=0.05, hspace=0.05)
    
    ax1 = plt.subplot(gs1[0:4, 0]) # Original
    ax2 = plt.subplot(gs1[0:4, 1]) # Model
    ax3 = plt.subplot(gs1[4:8, 0]) # Residual+Sky
    ax4 = plt.subplot(gs1[4:7, 1]) # SB profile
    ax5 = plt.subplot(gs1[7:8, 1])# SB residuals
    
    # Hide tick labels
    plt.setp(ax1.get_yticklabels(), visible=False)
    plt.setp(ax1.get_xticklabels(), visible=False)
    plt.setp(ax2.get_yticklabels(), visible=False)
    plt.setp(ax2.get_xticklabels(), visible=False)
    plt.setp(ax3.get_yticklabels(), visible=False)
    plt.setp(ax3.get_xticklabels(), visible=False)
    plt.setp(ax4.get_xticklabels(), visible=False)
    
    ax4.invert_yaxis()
    ax4.set_ylabel(r'Surface Brightness, $\mu$ [mag arcsec$^{-2}$]')
    ax5.set_ylabel(r'$\Delta\mu$')
    ax5.set_xlabel('Semi-major Axis [arcsec]')
    ax5.grid(b=True)
    ax4.set_xscale('log')
    ax5.set_xscale('log')
    
    gs1.tight_layout(fig)
    
    nbins = len(ax5.get_xticklabels())
    ax5.yaxis.set_major_locator(MaxNLocator(nbins=nbins, prune='upper'))
    ax4.yaxis.set_major_locator(MaxNLocator(nbins=nbins, prune='upper'))
    
    # change axis location of ax5
    pos4 = ax4.get_position()
    pos5 = ax5.get_position()
    
    points4 = pos4.get_points()
    points5 = pos5.get_points()
    
    points5[1][1]=points4[0][1]
    
    pos5.set_points(points5)
    
    ax5.set_position(pos5)
    # Show the plot
    plt.show()
    
    此代码应生成以下内容:

    好极了。工作完美。谢谢