Python 具有相等纵横比和单个色条的matplotlib子图块

Python 具有相等纵横比和单个色条的matplotlib子图块,python,matplotlib,subplot,Python,Matplotlib,Subplot,我想画4个等长宽比的子图,每个子图有一个单独的色条。我快写完了,但是我发现字体太大了,颜色条的位置不好,因为它们与x轴标题重叠;请参阅所附代码和生成的图像。如何获得更好的结果 import numpy import matplotlib.pyplot as plt data = numpy.random.random((3, 10)) fig, (ax1, ax2, ax3, ax4) = plt.subplots(nrows=4) im1 = ax1.pcolormesh(data) ax1.

我想画4个等长宽比的子图,每个子图有一个单独的色条。我快写完了,但是我发现字体太大了,颜色条的位置不好,因为它们与x轴标题重叠;请参阅所附代码和生成的图像。如何获得更好的结果

import numpy
import matplotlib.pyplot as plt
data = numpy.random.random((3, 10))
fig, (ax1, ax2, ax3, ax4) = plt.subplots(nrows=4)
im1 = ax1.pcolormesh(data)
ax1.set_title('IM1')
im2 = ax2.pcolormesh(data)
ax2.set_title('IM2')
im3 = ax3.pcolormesh(data)
ax3.set_title('IM3')
im4 = ax4.pcolormesh(data)
ax4.set_title('IM4')
for ax, tc in zip((ax1, ax2, ax3, ax4), (im1, im2, im3, im4)):
    ax.tick_params(direction='out', which='both', top=True, right=True)
    ax.minorticks_on()
    ax.set_aspect('equal')
    ax.set_xlabel('$x$')
    ax.set_ylabel('$y$')
    fig.colorbar(tc, ax=ax, orientation='horizontal')
fig.tight_layout()
fig.savefig('im.png', dpi=300, bbox_inches='tight')

除了我的评论之外:

  • 您可以通过更改字体大小或更改图形大小来缩放字体大小。如果我们更改图形大小,您可以使用:
    。。。plt.子批次(…,figsize=(50,10))

  • 通过将颜色条“附加”到相关轴,可以更好地放置颜色条

  • 有关这两点,请参见此更新示例:

    import numpy
    import matplotlib.pyplot as plt
    from mpl_toolkits.axes_grid1 import make_axes_locatable
    
    data = numpy.random.random((3, 10))
    fig, (ax1, ax2, ax3, ax4) = plt.subplots(nrows=4,figsize=(50,10))
    im1 = ax1.pcolormesh(data)
    ax1.set_title('IM1')
    im2 = ax2.pcolormesh(data)
    ax2.set_title('IM2')
    im3 = ax3.pcolormesh(data)
    ax3.set_title('IM3')
    im4 = ax4.pcolormesh(data)
    ax4.set_title('IM4')
    
    for ax, im in zip((ax1, ax2, ax3, ax4), (im1, im2, im3, im4)):
        ax.tick_params(direction='out', which='both', top=True, right=True)
        ax.minorticks_on()
        ax.set_aspect('equal')
        ax.set_xlabel('$x$')
        ax.set_ylabel('$y$')
        div  = make_axes_locatable(ax)
        cax  = div.append_axes("bottom", size="20%", pad=0.5)
        cbar = plt.colorbar(im,cax=cax,orientation='horizontal')
    
    fig.tight_layout()
    fig.savefig('im.png', dpi=300, bbox_inches='tight')
    
    这将生成下面的图像


    我只是不确定是否会自动为填充设置一个值。也许其他人可以贡献?

    您可以为每个元素设置字体大小并更改颜色栏的位置。这是我的解决方案:

    import numpy
    import matplotlib.pyplot as plt
    data = numpy.random.random((3, 10))
    fig, (ax1, ax2, ax3, ax4) = plt.subplots(nrows=4)
    im1 = ax1.pcolormesh(data)
    ax1.set_title('IM1', size = 3) # size arguments for font changes
    im2 = ax2.pcolormesh(data)
    ax2.set_title('IM2', size = 3)
    im3 = ax3.pcolormesh(data)
    ax3.set_title('IM3', size = 3)
    im4 = ax4.pcolormesh(data)
    ax4.set_title('IM4', size = 3)
    for ax, tc in zip((ax1, ax2, ax3, ax4), (im1, im2, im3, im4)):
        ax.tick_params(labelsize = 3, direction='out', which='both', top=True, right=True)
        ax.minorticks_on()
        ax.set_aspect('equal')
        ax.set_xlabel('$x$', size = 3)
        ax.set_ylabel('$y$', size = 3)
        cbar = fig.colorbar(tc, ax=ax, orientation='horizontal', pad=0.5) # pad for positioning colorbar
        cbar.ax.tick_params(labelsize=2) # labelsize for colorbar
    fig.tight_layout()
    fig.savefig('im.png', dpi=300, bbox_inches='tight')
    

    我不确定这是不是最好的方法,但很简单,很快就能做到:同时,你也应该考虑这个建议来设置这个数字的大小。


    我希望有帮助

    为了使用
    n
    水平色条(每个轴下一个)创建
    n
    子图,您可以创建一个
    2*n
    轴的轴网格,其中每秒钟的轴高度要小得多。这些较小的轴可以承载颜色条

    import numpy as np
    import matplotlib.pyplot as plt
    
    n=4
    data = np.random.random((3, 10))
    ratios = np.ones(2*n)
    ratios[1::2]=0.05
    fig, axes = plt.subplots(nrows=2*n, figsize=(4,2*n),
                             gridspec_kw={"height_ratios":ratios})
    
    for i,ax in enumerate(axes[::2]):
        im = ax.pcolormesh(data)
        ax.set_title('IM{}'.format(i+1))
        ax.tick_params(direction='out', which='both', top=True, right=True)
        ax.minorticks_on()
        ax.set_aspect('equal')
        ax.set_xlabel('$x$')
        ax.set_ylabel('$y$')
        fig.colorbar(im, cax=axes[2*i+1], orientation='horizontal')
    
    fig.tight_layout()
    fig.savefig('im.png', dpi=300, bbox_inches='tight')
    
    plt.show()
    

    我不确定色条的自动定位是否正确,但我可以提供建议,指定图形大小,使字体成比例。例如:
    。。。plt.subplot(…,figsize=(50,10))
    我不确定这4个子地块垂直堆叠的决定是否是由于其他一些限制,但是停止重叠标签等可以通过子地块的不同布局轻松得多。我认为很难自动调整填充,因为它还取决于字体大小。但您在这里选择的值对于dafault案例来说似乎是合适的。