2011-08-04 10 views
5

Mam subplot z 28 linii x 2 kolumny (może się to zmienić, faktycznie). Skala yaxis wszystkich linii pierwszej kolumny powinna być taka sama (to musi działać również dla tej drugiej kolumny). ...Pomoc przy tworzeniu dużego subplota wygląda ładniej i wyraźniej

Wszystkie xaxy mają być takie same.

Co chcę zrobić, to zrobić coś wewnątrz figury wyjściowej, która pokazuje, jaka jest wartość Yaxis dla 1. i 2. kolumny, a jaka jest xaxis dla obu kolumn ... Chcę również uzyskać etykietę do góry w pierwszej i drugiej kolumnie (mówiąc, jakie są te dane).

Chcę również zmienić wygląd wykresów, aby był wyraźniejszy (prawdopodobnie zwiększając rozmiar aspektu osi i zmniejszając nieco rozmiar osi xaxis).

subplot chcę, bez ponownego zaklejania, powinno być coś takiego:

Output Figure

To może być coś innego. Naprawdę nie wiem, co mogę zrobić z mojej prośby.

kod I USD, aby wygenerować rysunek (bez etykiety farby robione):

def pltconc(conc,self): 
t=self.t 
idx1=0 
conc=conc*1000000 


c=len(find(self.ml[:,3]==1)) 

from scipy.stats import scoreatpercentile #To adjust the scales 
ymin1 = max([median(scoreatpercentile(conc[:,i,:],0.05)) for i in range(28)]) 
ymax1 = max([median(scoreatpercentile(conc[:,i,:],99.95)) for i in range(28)]) 

for idx1 in range(c): 
    a=subplot(c,2,2*idx1+1, adjustable='box-forced') 
    plt.plot(t,conc[:,idx1,0],color='r') 
    plt.plot(t,conc[:,idx1,1],color='b') 
    plt.axis('tight') 
    xlim(0,max(self.t)) 
    ylim(ymin1,ymax1) 
    frame1 = plt.gca() 
    a.set_yticklabels([]) 
    a.set_xticklabels([]) 


    ax=subplot(c,2,2*idx1+2, adjustable='box-forced') 
    CBV = (conc[:,idx1,2]*100)/(90+conc[:,idx1,2]) 
    StO2 = (conc[:,idx1,0]*100)/(90+conc[:,idx1,2]) 
    ymin2 = max(median(scoreatpercentile(CBV,0.05)),median(scoreatpercentile(StO2,0.05))) 
    ymax2 = max(median(scoreatpercentile(StO2,99.95)),median(scoreatpercentile(CBV,99.95))) 
    plt.plot(t,CBV, color='m') 
    plt.plot(t,StO2, color = 'b') 
    plt.axis('tight') 
    xlim(0,max(self.t)) 
    ylim(ymin2,ymax2) 
    frame1 = plt.gca() 
    ax.set_yticklabels([]) 
    ax.set_xticklabels([]) 

Bardzo dziękuję za pomoc.

Zmieniłem kod, ponieważ zdałem sobie sprawę, że nie zostały poprawnie skalowane. Wynik powinien być nieco inny, ale nie ma to znaczenia dla tego pytania.

Odpowiedz

3

Nie jestem do końca pewien, co prosisz, ale oto jak bym go o spiskowanie coś wzdłuż tych linii ...

Proporcje dla twojej figury jest kontrolowana przez figsize kwarg do plt.figure (lub plt.subplots, w tym przypadku).

Resztę można wykonać, stosując rozsądną aplikację annotate.

Oto przykład:

import matplotlib.pyplot as plt 
import numpy as np 

# Generate the data 
data = (np.random.random((20, 2, 2, 1001)) - 0.5).cumsum(axis=-1) 

# Set up the figure (the figsize is what's going to control your aspect ratio) 
fig, axes = plt.subplots(nrows=20, ncols=2, sharex=True, figsize=(6, 10)) 
fig.subplots_adjust(wspace=0.1, hspace=0, bottom=0.05) 

# Turn off tick labels everywhere 
for ax in axes.flat: 
    for axis in [ax.xaxis, ax.yaxis]: 
     axis.set_ticklabels([]) 

# Plot the data 
color = {(0,0):'red', (0,1):'green', (1,0):'blue', (1,1):'magenta'} 
for (i,j), ax in np.ndenumerate(axes): 
    for k in range(2): 
     ax.plot(data[i,j,k,:], color=color[(j,k)]) 

# Add stacked titles (and text legends) 
titles = [['TITLE:', 'Red: Data X', 'Green: Data Y'], 
      ['TITLE:', 'Blue: Data W', 'Magenta: Data Z']] 
for i, title in enumerate(titles): 
    for text, ypos in zip(title, [35, 20, 5]): 
     axes[0,i].annotate(text, xy=(0.05, 1.0), xytext=(0, ypos), va='bottom', 
          xycoords='axes fraction', textcoords='offset points') 

# Add arrows on "super-Y" axes 
xpos, length = -0.1, 5 
axes[12,0].annotate('', xy=(xpos, 0), xytext=(xpos, length), 
     xycoords='axes fraction', textcoords='axes fraction', 
     arrowprops=dict(arrowstyle='<|-')) 
axes[12,0].annotate('{0} subplots'.format(length), xy=(xpos, length/2.0), 
     xycoords='axes fraction', rotation=90, va='center', ha='right') 

# Add arrows on "super-X" axes 
ypos, length = -0.7, 1000 
axes[-1,0].annotate('', xy=(0, ypos), xytext=(length, ypos), 
     xycoords=('data', 'axes fraction'), textcoords=('data', 'axes fraction'), 
     arrowprops=dict(arrowstyle='<|-')) 
axes[-1,0].annotate('{0} data units'.format(length), xy=(length/2.0, ypos), 
     xytext=(0, 5), xycoords=('data', 'axes fraction'), 
     textcoords='offset points', ha='center', va='bottom') 

plt.show() 

enter image description here

+0

Ye, który był prawie coś liek że chciałem .. jedyną rzeczą jest to, że muszę 2 strzały superY (każda kolumna ma Differente skalę) i chcę że kleszcze, które miały być na grapchis, idą do strzałki (chcę, żeby ta strzałka pokazała jaka jest skala y dla każdej kolumny ...) ... wpadła na pomysł? –

+0

Btw, muszę wykonać 2 strzały, wystarczy, że pokażę skalę grafiki ... A strzały muszą mieć również tytuł (coś w rodzaju punktów czasowych) –

Powiązane problemy