Python 向多个imshow()绘图添加颜色栏和线条

Python 向多个imshow()绘图添加颜色栏和线条,python,numpy,matplotlib,scipy,Python,Numpy,Matplotlib,Scipy,我有以下源代码: idx=0 b=plt.psd(dOD[:,idx],Fs=self.fs,NFFT=512) B=np.zeros((2*len(self.Chan),len(b[0]))) B[idx,:]=20*log10(b[0]) c=plt.psd(dOD_filt[:,idx],Fs=self.fs,NFFT=512) C=np.zeros((2*len(self.Chan),len(b[0]))) C[idx,:]=20*log10(c[0]) for idx in ran

我有以下源代码:

idx=0
b=plt.psd(dOD[:,idx],Fs=self.fs,NFFT=512)
B=np.zeros((2*len(self.Chan),len(b[0])))
B[idx,:]=20*log10(b[0])

c=plt.psd(dOD_filt[:,idx],Fs=self.fs,NFFT=512)
C=np.zeros((2*len(self.Chan),len(b[0])))
C[idx,:]=20*log10(c[0])

for idx in range(2*len(self.Chan)):
    b=plt.psd(dOD[:,idx],Fs=self.fs,NFFT=512)
    B[idx,:]=20*log10(b[0])

    c=plt.psd(dOD_filt[:,idx],Fs=self.fs,NFFT=512)
    C[idx,:]=20*log10(c[0])

## Calculate the color scaling for the imshow()    
aux1 = max(max(B[i,:]) for i in range(size(B,0)))
aux2 = min(min(B[i,:]) for i in range(size(B,0)))
bux1 = max(max(C[i,:]) for i in range(size(C,0)))
bux2 = min(min(C[i,:]) for i in range(size(C,0)))
scale1 = 0.75*max(aux1,bux1)
scale2 = 0.75*min(aux2,bux2)


fig, axes = plt.subplots(nrows=2, ncols=1,figsize=(7,7))#,sharey='True')
fig.subplots_adjust(wspace=0.24, hspace=0.35)

ii=find(c[1]>frange)[0]

## Making the plots
cax=axes[0].imshow(B, origin = 'lower',vmin=scale2,vmax=scale1)
axes[0].set_ylim((0,2*len(self.Chan)))
axes[0].set_xlabel(' Frequency (Hz) ')
axes[0].set_ylabel(' Channel Number ') 
axes[0].set_title('Pre-Filtered')
cax2=axes[1].imshow(C, origin = 'lower',vmin=scale2,vmax=scale1)
axes[1].set_ylim(0,2*len(self.Chan))
axes[1].set_xlabel(' Frequency (Hz) ')
axes[1].set_ylabel(' Channel Number ')
axes[1].set_title('Post-Filtered')

axes[0].annotate('690nm', xy=((ii+1)/2, len(self.Chan)/2-1), 
        xycoords='data', va='center', ha='right')
axes[0].annotate('830nm', xy=((ii+1)/2, len(self.Chan)*3/2-1 ), 
        xycoords='data', va='center', ha='right')
axes[1].annotate('690nm', xy=((ii+1)/2, len(self.Chan)/2-1), 
        xycoords='data', va='center', ha='right')
axes[1].annotate('830nm', xy=((ii+1)/2, len(self.Chan)*3/2-1 ), 
        xycoords='data', va='center', ha='right')


axes[0].axis('tight')
axes[1].axis('tight')

## Set up the xlim to aprox frange Hz
axes[0].set_xlim(left=0,right=ii)
axes[1].set_xlim(left=0,right=ii)

## Make the xlabels become the actual frequency number
tickslabel=np.zeros((ii))
ticks = r_[0:ii:5]
tickslabel = linspace(0.,2.,size(ticks))
axes[0].set_xticks(ticks)
axes[0].set_xticklabels(tickslabel)
axes[1].set_xticks(ticks)
axes[1].set_xticklabels(tickslabel)


## Draw a line to separate the two different wave lengths, and name each region
l1 = Line2D([0,ii],[28,10],ls=':',color='black')                                    
axes[0].add_line(l1)
axes[1].add_line(l1)
此代码生成以下图形:

使xticks看起来正确的固定代码已经在代码中,并且还显示了新的绘图

如何为这两个子图添加一个颜色栏(并给它一个标题)?(比例相同) 此颜色条应占据图形的整个左侧

在代码中有一个地方,我试图在两个图中画一条线(在同一个地方),但都没有显示出来。为什么呢


如果您需要有关我的代码的更多信息(如输入数据的大小,请询问)

您的ticks变量显示为全零:

ticks=np.zeros((ii))
但它应该列举X个位置(在轴坐标中),您希望记号标记的位置。当您调用setxticklabels时,列表会给出每个勾号要显示的文本

下面是一个简单的示例,展示了xlim、SETxticks和SETxticklabel是如何交互的:

from pylab import *
x = arange(128*128).reshape((128,128))
matshow(x)
xlim(right=64)
# xticks: where the xticks should go (indexes into x's columns)
xticks = r_[0:64:25]
gca().set_xticks(xticks)
# labels: text to show for each element of xticks
#    here, we apply a multiplier just to show how the
#    labels can differ from the xticks.
labels = ['%.1f' % (x,) for x in xticks * pi / 2]
gca().set_xticklabels(labels)
show()

如前所述,您需要使xtick不是零。你可以用像这样的东西

xticks = linspace(0.,2.,5)
这将给你5分,介于0.0和2.0之间。要获得颜色栏,请使用

fig.colorbar()
这在
由于数据具有相同的比例,为任意一组数据添加一个颜色条应该可以满足您的需要,但您可能需要调整其位置

我的问题更多的是调整色条的位置,而不是添加它。我想在它们的右边有一个colobar(两个图的大小)。我不知道如何使用子地块Instance进行此操作。