Добавление цветовой шкалы и линии на несколько графиков imshow () - PullRequest
1 голос
/ 25 марта 2012

У меня есть этот исходный код:

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 ]

2 голосов
/ 25 марта 2012

Ваша переменная ticks выглядит как все нули:

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 голос
/ 25 марта 2012

Как уже упоминалось, вам нужно, чтобы символы не были нулями.Вы можете использовать что-то вроде

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

, что даст вам 5 баллов от 0,0 до 2,0.Чтобы получить цветную полосу, используйте

fig.colorbar()

, что показано на http://matplotlib.sourceforge.net/examples/pylab_examples/colorbar_tick_labelling_demo.html Поскольку данные имеют одинаковый масштаб, добавление цветовой полосы для любого набора данных должно помочь вам, но вывозможно, придется настроить его размещение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...