2011-08-04 23 views
5

Tôi có một subplot 28 dòng x 2 cột (nó có thể thay đổi, thực sự). Quy mô yaxis của tất cả các dòng của cột thứ nhất được cho là giống nhau (cũng phải hoạt động cho cột thứ 2 đó) ....Trợ giúp với việc tạo một subplot lớn trông đẹp hơn và rõ ràng hơn

Tất cả các xaxis được cho là giống nhau.

Điều tôi muốn làm là tạo thứ gì đó bên trong hình đầu ra cho biết yaxis là gì cho cột thứ nhất và thứ 2 và xaxis cho cả hai cột ... Tôi cũng muốn có nhãn để lên trên tại cột 1 và 2 (nói những dữ liệu đó là gì).

Tôi cũng muốn thay đổi khía cạnh của ô để có thể nhìn thấy rõ hơn (có thể tăng kích cỡ khung hình yaxis và giảm kích thước xaxis một chút).

Các âm mưu phụ tôi muốn, mà không có sự tái định cỡ, nên có một cái gì đó như thế này:

Output Figure

Nó có thể là một cái gì đó khác nhau. Tôi thực sự không biết có thể làm gì ngoài yêu cầu của mình.

Mã i usd để tạo ra các con số (không có nhãn sơn-made):

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

Cảm ơn rất nhiều cho sự giúp đỡ.

Tôi đã thay đổi mã vì tôi đã nhận ra rằng chúng không được thu nhỏ một cách chính xác. Các con số đầu ra nên có một chút khác biệt, nhưng nó không thực sự quan trọng cho mục đích câu hỏi này.

Trả lời

3

Tôi không hoàn toàn chắc chắn những gì bạn đang yêu cầu, nhưng dưới đây là cách tôi muốn đi về âm mưu gì đó dọc theo những đường ...

Các tỉ lệ cho con của bạn được điều khiển bởi figsize kwarg để plt.figure (hoặc plt.subplots, trong trường hợp này).

Phần còn lại bạn có thể làm với ứng dụng khôn ngoan annotate.

Dưới đây là một ví dụ:

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 đó là gần như một cái gì đó liek mà tôi muốn .. điều duy nhất là tôi cần 2 mũi tên superY (mỗi cột có differente quy mô) và tôi muốn rằng những con ve được cho là đang ở trên cây grapchis đi đến mũi tên (tôi muốn mũi tên đó thể hiện quy mô y cho từng cột ...) ... có ý tưởng gì không ?? –

+0

Btw, tôi phải tạo mũi tên thứ 2, chỉ cần làm cho nó hiển thị tỷ lệ của đồ họa ... Và các mũi tên cũng cần có tiêu đề (giống như các điểm Thời gian) –

Các vấn đề liên quan