Matplotlib colorbar moves second x axis

前端 未结 2 897
孤城傲影
孤城傲影 2021-01-22 03:28

I\'m trying to add a second x axis to the top of a plot using twiny.

If I make a simple scatter plot with no colorbar, the top x axis is correctly aligned with the botto

2条回答
  •  说谎
    说谎 (楼主)
    2021-01-22 03:58

    You can have the colorbar 'steal' space from more than one ax

    import numpy as np
    import matplotlib.pyplot as plt
    from mpl_toolkits.axes_grid1 import make_axes_locatable
    import matplotlib.gridspec as gridspec
    
    X = np.array([0., 0.5, 1., 1.5, 2., 2.5, 3., 3.5, 4.])
    X2 = np.array([122, 85, 63, 50, 23, 12, 7, 5, 2])
    Y = np.cos(X*20)
    Z = np.sin(X*20)
    
    fig = plt.figure()
    gs = gridspec.GridSpec(1, 2)
    ax1 = plt.subplot(gs[1])
    ax2 = ax1.twiny()
    
    ax1.set_xlim(-0.2, max(X)+0.2)
    plt.tick_params(axis='both', which='major', labelsize=10)
    ax1.minorticks_on()
    ax1.grid(b=True, which='major', color='gray', linestyle='--', lw=0.3)
    
    SC = ax1.scatter(X, Y, c=Z, cmap='viridis')
    ax1.set_xlabel("Original x-axis")
    
    ax2.set_xlim(ax1.get_xlim())
    ax2.set_xticks(X)
    ax2.set_xticklabels(X2)
    ax2.set_xlabel("Second x-axis")
    
    # Colorbar.
    cbar = plt.colorbar(SC, ax=[ax1, ax2])
    cbar.set_label('B', fontsize=10, labelpad=4, y=0.5)
    cbar.ax.tick_params(labelsize=10)
    
    plt.show()
    

    which I think will un-block your use case.

    Limits are a bit different because I am sitting on the current master branch.

    If you need to use tight_layout something like this (which requires some tuning on padding etc):

    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib.gridspec as gridspec
    
    
    X = np.array([0., 0.5, 1., 1.5, 2., 2.5, 3., 3.5, 4.])
    X2 = np.array([122, 85, 63, 50, 23, 12, 7, 5, 2])
    Y = np.cos(X*20)
    Z = np.sin(X*20)
    
    fig = plt.figure()
    gs = gridspec.GridSpec(1, 2)
    right_gs = gridspec.GridSpecFromSubplotSpec(1, 2, width_ratios=[30, 1], subplot_spec=gs[1], wspace=0.05)
    
    ax1 = fig.add_subplot(right_gs[0])
    color_axis = fig.add_subplot(right_gs[1])
    
    
    
    ax2 = ax1.twiny()
    
    ax1.set_xlim(-0.2, max(X)+0.2)
    plt.tick_params(axis='both', which='major', labelsize=10)
    ax1.minorticks_on()
    ax1.grid(b=True, which='major', color='gray', linestyle='--', lw=0.3)
    
    SC = ax1.scatter(X, Y, c=Z, cmap='viridis')
    ax1.set_xlabel("Original x-axis")
    
    ax2.set_xlim(ax1.get_xlim())
    ax2.set_xticks(X)
    ax2.set_xticklabels(X2)
    ax2.set_xlabel("Second x-axis")
    
    cbar = fig.colorbar(SC, cax=color_axis)
    cbar.set_label('B', fontsize=10, labelpad=4, y=0.5)
    cbar.ax.tick_params(labelsize=10)
    
    fig.tight_layout()
    plt.show()
    

提交回复
热议问题