将子图与颜色条对齐

时间:2017-06-21 17:01:25

标签: python matplotlib subplot imshow

我想分享一个imshow的x轴,它必须是正方形和一个经典的情节:

  1. imshow必须是正方形
  2. 使用颜色栏
  3. 下图应共享同一轴(或至少看起来与imshow对齐)
  4. 我花了两天时间,现在我疯了。有人知道如何对齐它们吗?

    square imshow on the top, with a color bar, and bellow a plot, that should share the same axis

    用于制作图像的代码如下:

    def myplot( Nbin=20 ):
    
    X = np.random.rand(1000)
    Y = np.random.rand(1000)
    h2, yh2, xh2 = np.histogram2d( Y, X, bins=[Nbin,Nbin] )
    h1, xh1 = np.histogram( X, bins=Nbin )
    ######################################
    ######################################
    fig = plt.figure(  )
    gs = gridspec.GridSpec( 3, 2 )
    ######################################
    ######################################
    ax1 = plt.subplot( gs[:-1,:] )
    im = plt.imshow( h2, interpolation='nearest', origin='lower',
                     extent=[xh2[0],xh2[-1],yh2[0],yh2[-1]] )
    cb = plt.colorbar( im, ax=ax1 )
    plt.xlim( xh1[0], xh1[-1] )
    plt.ylim( xh1[0], xh1[-1] )
    ax1.tick_params( axis='x', which='both', bottom='on', top='on', labelbottom='off' )
    ######################################
    ######################################
    ax2 = plt.subplot( gs[-1,:] )
    plt.plot( xh1[:-1] + np.diff(xh1)/2., h1 )
    plt.xlim( xh1[0], xh1[-1] )
    cm = plt.cm.Blues
    cb2 = plt.colorbar( ax=ax2 )
    ax2.tick_params( axis='x', which='both', bottom='on', top='on', labelbottom='on' )
    ######################################
    ######################################
    fig.tight_layout()
    fig.subplots_adjust(hspace=0.05)
    cb2.ax.set_visible(False)
    

1 个答案:

答案 0 :(得分:4)

我可以想象,将第二个轴直接放在图像下方的最简单方法是使用mpl_toolkits.axes_grid1.make_axes_locatable。这允许以新创建的子图为代价缩小图像,并且可以同样用于定位颜色条。

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable

Nbin=20

X = np.random.rand(1000)
Y = np.random.rand(1000)
h2, yh2, xh2 = np.histogram2d( Y, X, bins=[Nbin,Nbin] )
h1, xh1 = np.histogram( X, bins=Nbin )

fig = plt.figure(  )


ax1 = plt.subplot(111)
im = ax1.imshow( h2, interpolation='nearest', origin='lower',
                 extent=[xh2[0],xh2[-1],yh2[0],yh2[-1]] )

plt.xlim( xh1[0], xh1[-1] )
plt.ylim( xh1[0], xh1[-1] )
ax1.tick_params( axis='x', which='both', bottom='on', top='on', labelbottom='off' )


divider = make_axes_locatable(ax1)
ax2 = divider.append_axes("bottom", size="50%", pad=0.08)
cax = divider.append_axes("right", size="5%", pad=0.08)
cb = plt.colorbar( im, ax=ax1, cax=cax )

#ax2 = plt.subplot( gs[-1,:] )  # , sharex=ax1
ax2.plot( xh1[:-1] + np.diff(xh1)/2., h1 )
ax2.set_xlim( xh1[0], xh1[-1] )
cm = plt.cm.Blues

ax2.tick_params( axis='x', which='both', bottom='on', top='on', labelbottom='on' )

plt.show()

enter image description here