2012-03-25 129 views
1

我有这样的源代码:添加颜色条和一个线到多个imshow()绘制

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) 

此代码生成此图中: The ploted Figure

固定的代码以使xticks看起来正常是已经在代码中,并且还显示了新的情节。

如何为这两个子图添加一个单色条(并给它一个标题)? (它们的尺寸相同) 此色条应占据图的整个左侧。

在代码里面有一个地方我试图在两个图中画一条线(在同一个地方),但没有显示这些。这是为什么?

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

回答

2

你蜱变量似乎是全零:

ticks=np.zeros((ii)) 

但应该列举X位置(以轴坐标)您希望的刻度线去。当您调用set_xticklabels时,列表会显示每个打勾的文本。

这里展示了如何XLIM,set_xticks和set_xticklabels相互作用一个简单的例子:

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() 
1

前面已经提到的,你需要有xticks不为零。你可以使用像

xticks = linspace(0.,2.,5) 

这将给你5点之间0.0和2.0。为了得到一个彩条使用

fig.colorbar() 

这证明在http://matplotlib.sourceforge.net/examples/pylab_examples/colorbar_tick_labelling_demo.html 由于数据具有相同的规模,增加了彩条的任一组数据应该为你做的伎俩,但你可能需要调整它的位置。

+0

我的问题是关于调整颜色条的位置而不是添加它。我想在他们的右边有一个单个的colobar(这两个地块的大小)。我没有线索如何用subplot instnace做到这一点。 – 2012-03-25 20:48:42

相关问题