Skip to main content
 首页 » 编程设计

python之将子图与颜色条对齐

2025年05月04日25fff_TT

我正在尝试分享必须为正方形的 imshow 的 x 轴和经典图:

  1. imshow 必须是方形的
  2. 带有颜色条
  3. 下面的图应该共享同一个轴(或者至少看起来与 imshow 对齐)

我花了两天时间搞定,现在我疯了。有人知道如何对齐它们吗?

用于生成图像的代码如下。

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) 

请您参考如下方法:

我可以想象,让第二个轴直接位于图像下方的最简单方法是使用 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()