2012-03-25 11 views
1

ich diesen Quellcode haben:eine colorbar und eine Linie, um mehrere imshow Hinzufügen() zeichnet

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) 

Dieser Code diesen Wert erzeugt: The ploted Figure

Der feste Code, um die xticks zu machen sieht richtig sind bereits innerhalb des Codes, und der neue Plot wird ebenfalls angezeigt.

Wie kann ich diesen beiden Teilzeichnungen eine einzelne Farbleiste hinzufügen (und ihr einen Titel geben)? (sie sind im gleichen Maßstab) Diese Farbleiste sollte die ganze linke Seite der Figur einnehmen.

Innerhalb des Codes gibt es einen Platz Ich versuche, eine Linie in beiden Figuren (an der gleichen Stelle) zu zeichnen, aber keiner von ihnen wird angezeigt. Warum das?

Wenn Sie weitere Informationen über meinen Code benötigen (wie die Größe der eingegebenen Daten, fragen Sie einfach).

Antwort

2

Ihre Zecken Variable erscheint alle Nullen zu sein:

ticks=np.zeros((ii)) 

aber es sollte X-Stellen aufzählen (in Achsenkoordinaten), wo Sie die Strichmarkierungen möchten zu gehen. Wenn Sie set_xticklabels aufrufen, gibt die Liste den Text an, der für jeden Tick angezeigt werden soll.

Hier ist ein einfaches Beispiel zeigt, wie Xlim, set_xticks und set_xticklabels interagieren:

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

Wie bereits erwähnt, müssen Sie die xticks haben nicht Nullen sein. Sie könnten etwas wie

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

verwenden, die Ihnen 5 Punkte zwischen 0,0 und 2,0 geben wird. Um eine Farbleiste

fig.colorbar() 

die bei http://matplotlib.sourceforge.net/examples/pylab_examples/colorbar_tick_labelling_demo.html Da die Daten gezeigt wird, um den gleichen Maßstab hat, das Hinzufügen eines colorbar entweder eingestellt von Daten sollte den Trick für Sie tun, aber man muss eventuell die Platzierung einstellen .

+0

Mein Problem ist mehr über die Einstellung der Farbleiste, anstatt sie hinzuzufügen. Ich möchte eine einzelne Colobar (von der Größe beider Plots) auf der rechten Seite haben. Ich habe keine Ahnung, wie man das mit dem Subplot Instance macht. –

Verwandte Themen