2011-08-04 15 views
5

Tengo una subtrama de 28 líneas x 2 columnas (puede cambiar, en realidad). Se supone que la escala yaxis de todas las líneas de la primera columna es la misma (que también debe funcionar para esa segunda columna) ....Ayuda para hacer que una gran subtrama parezca más clara y más clara

Se supone que todos los xaxis son iguales.

Lo que quiero hacer es hacer algo dentro de la figura de salida que muestre qué es el eje de la primera y la segunda columnas y cuál es el eje x para ambas columnas ... También quiero obtener una etiqueta para arriba en la 1ra y 2da columna (diciendo cuáles son esos datos).

También quiero cambiar el aspecto de las parcelas para que se pueda ver con mayor claridad (lo que probablemente aumente el tamaño del aspecto de yaxis y aumente un poco el tamaño del eje x).

La trama secundaria que quiero, sin la modificación del tamaño, debe ser algo como esto:

Output Figure

Puede ser algo diferente. Realmente no sé qué es posible hacer de mi pedido.

El código i USD para generar la figura (sin las etiquetas de pintura a medida):

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([]) 

Muchas gracias por la ayuda.

He cambiado el código desde que me di cuenta de que no estaba correctamente escalado. La cifra de salida debe ser un poco diferente, pero realmente no importa para este propósito de preguntas.

Respuesta

3

No estoy del todo seguro de lo que estás pidiendo, pero así es como me gustaría ir sobre el trazado algo por el estilo ...

La relación de aspecto para su figura es controlado por el figsize kwarg a plt.figure (o plt.subplots, en este caso).

El resto se puede hacer con la aplicación juiciosa de annotate.

He aquí un ejemplo:

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

Vosotros que era casi algo liek que quería .. lo único es que necesito 2 flechas Supery (cada columna tiene differente escala) y quiero que los tics que se suponía que estaban en el grapchis van a la flecha (quiero que esa flecha muestre cuál es la escala y para cada columna ...) ... ¿se me ocurrió la idea? –

+0

Por cierto, tengo que hacer las 2 ª flechas, solo tengo que hacer que muestre la escala de los gráficos ... Y las flechas deben tener un título también (algo así como puntos de tiempo (s)) –

Cuestiones relacionadas