将子图与颜色条对齐
Posted
技术标签:
【中文标题】将子图与颜色条对齐【英文标题】:Align subplot with colorbar 【发布时间】:2017-11-24 17:09:12 【问题描述】:我正在尝试共享必须是正方形和经典图的 imshow
的 x 轴:
-
imshow 必须是方形的
带有颜色条
下面的图应该共享相同的轴(或者至少看起来与 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)
【问题讨论】:
【参考方案1】:我可以想象将第二个轴直接放在图像下方的最简单方法是使用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()
【讨论】:
以上是关于将子图与颜色条对齐的主要内容,如果未能解决你的问题,请参考以下文章