zoukankan      html  css  js  c++  java
  • matplotlib 进阶之Tight Layout guide

    matplotlib教程学习笔记

    如何使用tight_layout?

    tight_layout作用于ticklabels, axis, labels, titles等Artist

    简单的例子

    import matplotlib.pyplot as plt
    import numpy as np
    

    下面的例子和constrained_layout中的是一样的,notebook没有显示出其中的问题,就是labels被遮挡了

    plt.rcParams['savefig.facecolor'] = "0.8"
    def example_plot(ax, fontsize=12):
        ax.plot([1, 2])
    
        ax.locator_params(nbins=3)
        ax.set_xlabel('x-label', fontsize=fontsize)
        ax.set_ylabel('y-label', fontsize=fontsize)
        ax.set_title('Title', fontsize=fontsize)
    
    plt.close('all')
    fig, ax = plt.subplots()
    example_plot(ax, fontsize=24)
    

    在这里插入图片描述

    fig, ax = plt.subplots()
    example_plot(ax, fontsize=24)
    plt.tight_layout()
    

    在这里插入图片描述

    注意到,每次作图,我们都需要通过使用plt.tight_layout()函数来激活,我们也可以通过
    fig.set_tight_layout(True)使得每次作图都会自动tight布局,当然,还可以通过将
    figure.autolayout rcParam设置为True来实现。

    有多个plots的时候,会出现重叠的现象,通过tight_layout可以解决

    plt.close('all')
    
    fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(nrows=2, ncols=2)
    example_plot(ax1)
    example_plot(ax2)
    example_plot(ax3)
    example_plot(ax4)
    

    在这里插入图片描述

    fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(nrows=2, ncols=2)
    example_plot(ax1)
    example_plot(ax2)
    example_plot(ax3)
    example_plot(ax4)
    plt.tight_layout()
    

    在这里插入图片描述
    tight_layout可以通过参数pad, w_pad, h_pad来设置一些布局的细节

    fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(nrows=2, ncols=2)
    example_plot(ax1)
    example_plot(ax2)
    example_plot(ax3)
    example_plot(ax4)
    plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=2) 
    

    在这里插入图片描述

    即使subplots的大小不一致,tight_layout依旧能够工作

    plt.close('all')
    fig = plt.figure()
    
    ax1 = plt.subplot(221)
    ax2 = plt.subplot(223)
    ax3 = plt.subplot(122)
    
    example_plot(ax1)
    example_plot(ax2)
    example_plot(ax3)
    
    plt.tight_layout()
    

    在这里插入图片描述

    对subplot2grid也有效,注意subplot2grid参数为:
    shape: e.g. (3, 3) 表示(3 imes 3)个格子

    loc: e.g. (0, 1) 表示从第一行第二列个格子开始

    rowspan: 跨行

    colspan: 跨列

    plt.close('all')
    fig = plt.figure()
    
    ax1 = plt.subplot2grid((3, 3), (0, 0))
    ax2 = plt.subplot2grid((3, 3), (0, 1), colspan=2)
    ax3 = plt.subplot2grid((3, 3), (1, 0), colspan=2, rowspan=2)
    ax4 = plt.subplot2grid((3, 3), (1, 2), rowspan=2)
    
    example_plot(ax1)
    example_plot(ax2)
    example_plot(ax3)
    example_plot(ax4)
    
    plt.tight_layout()
    

    在这里插入图片描述

    arr = np.arange(100).reshape((10, 10))
    
    plt.close('all')
    fig = plt.figure(figsize=(5, 4))
    
    ax = plt.subplot(111)
    im = ax.imshow(arr, interpolation="none")
    
    plt.tight_layout()
    

    在这里插入图片描述

    Use with GridSpec

    Gridspec 拥有自己的tight_layout()方法, 当然,plt.tight_layout也是有效的

    import matplotlib.gridspec as gridspec
    
    plt.close('all')
    fig = plt.figure()
    
    gs1 = gridspec.GridSpec(2, 1)
    ax1 = fig.add_subplot(gs1[0])
    ax2 = fig.add_subplot(gs1[1])
    
    example_plot(ax1)
    example_plot(ax2)
    
    gs1.tight_layout(fig)
    

    在这里插入图片描述

    gs.tight_layout提供rect参数,表示一个外界的框框
    默认是(0, 0, 1, 1)
    (x1, y1, x2, y2)

    (x1, y1)矩形限制框左下角点

    (x2, y2)矩形限制框右上角点

    fig = plt.figure()
    
    gs1 = gridspec.GridSpec(2, 1)
    ax1 = fig.add_subplot(gs1[0])
    ax2 = fig.add_subplot(gs1[1])
    
    example_plot(ax1)
    example_plot(ax2)
    
    gs1.tight_layout(fig, rect=[0, 0, 0.5, 1])
    

    在这里插入图片描述

    这个功能可以很好的用在分割图形,以及分块操作上

    fig = plt.figure()
    
    gs1 = gridspec.GridSpec(2, 1)
    ax1 = fig.add_subplot(gs1[0])
    ax2 = fig.add_subplot(gs1[1])
    
    example_plot(ax1)
    example_plot(ax2)
    
    gs1.tight_layout(fig, rect=[0, 0, 0.5, 1])
    
    gs2 = gridspec.GridSpec(3, 1)
    
    for ss in gs2:
        ax = fig.add_subplot(ss)
        example_plot(ax)
        ax.set_title("")
        ax.set_xlabel("")
    
    ax.set_xlabel("x-label", fontsize=12)
    
    gs2.tight_layout(fig, rect=[0.5, 0, 1, 1], h_pad=0.5)
    
    # We may try to match the top and bottom of two grids ::
    #为了让俩块图形上下一致,需要进行下面的操作
    top = min(gs1.top, gs2.top)
    bottom = max(gs1.bottom, gs2.bottom)
    
    gs1.update(top=top, bottom=bottom)
    gs2.update(top=top, bottom=bottom)
    plt.show()
    

    在这里插入图片描述

    但是呢,Title和右边的边边不齐,所以框框是不包含title的?

    fig = plt.gcf()
    
    gs1 = gridspec.GridSpec(2, 1)
    ax1 = fig.add_subplot(gs1[0])
    ax2 = fig.add_subplot(gs1[1])
    
    example_plot(ax1)
    example_plot(ax2)
    
    gs1.tight_layout(fig, rect=[0, 0, 0.5, 1])
    
    gs2 = gridspec.GridSpec(3, 1)
    
    for ss in gs2:
        ax = fig.add_subplot(ss)
        example_plot(ax)
        ax.set_title("")
        ax.set_xlabel("")
    
    ax.set_xlabel("x-label", fontsize=12)
    
    gs2.tight_layout(fig, rect=[0.5, 0, 1, 1], h_pad=0.5)
    
    top = min(gs1.top, gs2.top)
    bottom = max(gs1.bottom, gs2.bottom)
    
    gs1.update(top=top, bottom=bottom)
    gs2.update(top=top, bottom=bottom)
    
    top = min(gs1.top, gs2.top)
    bottom = max(gs1.bottom, gs2.bottom)
    
    gs1.tight_layout(fig, rect=[None, 0 + (bottom-gs1.bottom),
                                0.5, 1 - (gs1.top-top)])
    gs2.tight_layout(fig, rect=[0.5, 0 + (bottom-gs2.bottom),
                                None, 1 - (gs2.top-top)],
                     h_pad=0.5)
    

    在这里插入图片描述

    Legend and Annotations

    fig, ax = plt.subplots(figsize=(4, 3))
    lines = ax.plot(range(10), label='A simple plot')
    ax.legend(bbox_to_anchor=(0.7, 0.5), loc='center left',)
    fig.tight_layout()
    plt.show()
    

    在这里插入图片描述

    有些时候,我们不希望legend也在tight_layout的掌控范围之内,这个时候,我们可以设置leg.set_in_layout(False)

    fig, ax = plt.subplots(figsize=(4, 3))
    lines = ax.plot(range(10), label='B simple plot')
    leg = ax.legend(bbox_to_anchor=(0.7, 0.5), loc='center left',)
    leg.set_in_layout(False)
    fig.tight_layout()
    plt.show()
    

    在这里插入图片描述

    Use with AxesGrid1

    没看懂

    from mpl_toolkits.axes_grid1 import Grid
    
    plt.close('all')
    fig = plt.figure()
    grid = Grid(fig, rect=111, nrows_ncols=(2, 2),
                axes_pad=0.25, label_mode='L',
                )
    
    for ax in grid:
        example_plot(ax)
    ax.title.set_visible(False)
    
    plt.tight_layout()
    

    在这里插入图片描述

    Colorbar

    plt.close('all')
    arr = np.arange(100).reshape((10, 10))
    fig = plt.figure(figsize=(4, 4))
    im = plt.imshow(arr, interpolation="none")
    
    plt.colorbar(im, use_gridspec=True)
    
    plt.close('all')
    arr = np.arange(100).reshape((10, 10))
    fig = plt.figure(figsize=(4, 4))
    im = plt.imshow(arr, interpolation="none")
    
    plt.colorbar(im, use_gridspec=True)
    
    plt.tight_layout()
    

    在这里插入图片描述

    from mpl_toolkits.axes_grid1 import make_axes_locatable
    
    plt.close('all')
    arr = np.arange(100).reshape((10, 10))
    fig = plt.figure(figsize=(4, 4))
    im = plt.imshow(arr, interpolation="none")
    
    divider = make_axes_locatable(plt.gca())
    cax = divider.append_axes("right", "5%", pad="3%")
    plt.colorbar(im, cax=cax)
    
    plt.tight_layout()
    

    在这里插入图片描述

    函数链接

    plt.tight_layout

  • 相关阅读:
    oracl遇到的问题
    Ubuntu安装pyucharm的专业版本
    android adb logcat详解(三)
    android monkey压力测试(二)
    android adb常用命令(一)
    python *args 与 **kwargs
    python中带有下划线的变量和函数
    如何区分Python package
    Python Importlib.import_module动态导入模块
    python os.path.dirname(__file__)
  • 原文地址:https://www.cnblogs.com/MTandHJ/p/10883628.html
Copyright © 2011-2022 走看看