2016-05-09 30 views
1

私は6つのサブプロットをグラフ化するためにsuplot2gridを使用しています。これらのサブプロットのそれぞれに2つの時系列があります。これらの各サブプロットは、異なるY(垂直)軸に値を表示する必要があります。
私の現在の出力は、ウィッヒが私の目標に近いが、それでも間違っている、このようなものです:今、私は何をすべきか enter image description heresubplot2grid内の2つのプロット

次のとおりです。プロット関数

を定義

fig2 = plt.figure(figsize=(14,11)) 

# defining the axes 

ax1_a  = plt.subplot2grid((12,2),(0,0), rowspan=3, colspan=1) # drift 
ax1_b  = plt.subplot2grid((12,2),(4,0), rowspan=3, colspan=1, sharex=ax1_a) # zscore drift 
ax1_b  = ax1_a.twinx() 

ax2_a  = plt.subplot2grid((12,2),(4,0), rowspan=3, colspan=1, sharex=ax1_a) 
ax2_b  = plt.subplot2grid((12,2),(8,0), rowspan=3, colspan=1, sharex=ax1_a) 
ax2_b  = ax2_a.twinx() 

ax3_a  = plt.subplot2grid((12,2),(8,0), rowspan=3, colspan=1, sharex=ax1_a) 
ax3_b  = plt.subplot2grid((12,2),(11,0), rowspan=3, colspan=1, sharex=ax1_a) 
ax3_b  = ax3_a.twinx() 

ax4_a  = plt.subplot2grid((12,2),(0,1), rowspan=3, colspan=1) 
ax4_b  = plt.subplot2grid((12,2),(4,1), rowspan=3, colspan=1, sharex=ax4_a) 
ax4_b  = ax4_a.twinx() 

ax5_a  = plt.subplot2grid((12,2),(4,1), rowspan=3, colspan=1, sharex=ax4_a) 
ax5_b  = plt.subplot2grid((12,2),(8,1), rowspan=3, colspan=1, sharex=ax4_a) 
ax5_b  = ax5_a.twinx() 

ax6_a  = plt.subplot2grid((12,2),(8,1), rowspan=3, colspan=1, sharex=ax4_a) 
ax6_b  = plt.subplot2grid((12,2),(11,1), rowspan=3, colspan=1, sharex=ax4_a) 
ax6_b  = ax6_a.twinx() 

def plot_drift(axx,label): 
    axx.plot(df.index[-lenght:], df[label][-lenght:], linestyle='-', lw=2, 
      label=label,color='b',alpha=1.00) 

def plot_zscore(axx,label): 
    axx.plot(df.index[-lenght:], df[label][-lenght:], linestyle='-', lw=2, 
      label=label,color='g',alpha=1.00) 

def vertical_labels_drift(axx): 
    axx.set_ylabel('Vols') 
def vertical_labels_Zscore(axx): 
    axx.set_ylabel('Zscore') 

def stdev(axx): 
    axx.axhline(2,linewidth=2,color='yellow') # standard deviations   
    axx.axhline(-2,linewidth=2,color='yellow') # standard deviations  
    axx.axhline(3,linewidth=2,color='red')   
    axx.axhline(-3,linewidth=2,color='red') 


# plotting the drift 
for i,j in zip([ax1_a,ax2_a,ax3_a,ax4_a,ax5_a,ax6_a],cols_drift): 
    plot_drift(i,j) 
    vertical_labels_drift(i) 

# plotting the zscore 
for i,j in zip([ax1_b,ax2_b,ax3_b,ax4_b,ax5_b,ax6_b], cols_drift_Z): 
    plot_zscore(i,j) 
    stdev(i) 
    vertical_labels_Zscore(i) 

私の質問は、サブプロットの中に入る新しいプロットを定義する正しい方法は何ですか? ax1_aax1_bに同じ場所を配置すると、ax1_bで上書きされ、ax1_bだけがチャットされるため、ax1_aが上書きされます。言い換えれば、あなたはこれを行う場合:

ax1_a  = plt.subplot2grid((12,2),(0,0), rowspan=3, colspan=1) # drift 
ax1_b  = plt.subplot2grid((12,2),(0,0), rowspan=3, colspan=1, sharex=ax1_a) # zscore drift 
ax1_b  = ax1_a.twinx() 

ax1_a

は表示されません。

また、表示されている最初のコードに間違った場所が入力されていても、なぜ私のグラフが表示されているのか分かりません。 .twinx().twinx()を実行するときに、ax1_bax2_bなどと異なる場所を配置しても、それがチャートにリセットされるように見えます。それはあなたがaxes.twinx()の役割を誤解しているように私には思える

+0

は、どのようにあなたが取得している出力が異なるんを適用するために - それはあなたのfig UREを与えるものではありませんので、これは私の以前のコードと異なっていることあなたが望むものから? – tjollans

+0

@ tjollans答えのために空の副プロット – Gabriel

答えて

1

することは、あなたはクローンを持っている.twinx()を使用し、最初のカーブの最初のセットのために使用される(左のダニ)以降をインスタンス化する必要があります軸には、第2の曲線セットが描画されます。あなたは問題

import matplotlib.pyplot as plt 
import numpy as np 

t = np.linspace(0,1,101) 
nr, nc = 3, 2 
fig, axes_array = plt.subplots(nrows=nr, ncols=nc) 

for row_of_axes in axes_array: 
    for ax in row_of_axes: 
     ax.plot(t,np.sin(np.pi*t), color='black') 
     ax.twinx().plot(t,2*np.sin(np.pi*t)/(1.1-t), color='red') 

fig.tight_layout() 

enter image description here


P.S.に適応できることを

シンプルな例で、あなたのコーディングスタイルに近いが

... 
for r, row_of_axes in enumerate(axes_array): 
    for c, ax_a in enumerate(row_of_axes): 
     ax_b = ax_a.twinx() 
     ax_a.plot(t,np.sin(np.pi*t), color='black', label='a %d %d'%(r,c)) 
     ax_b.plot(t,2*np.sin(np.pi*t)/(1.1-t), color='red', label='b %d %d'%(r,c)) 
     ax_a.legend(loc=1) 
     ax_b.legend(loc=3) 

fig.tight_layout() 

enter image description here


は、あなたは、単にリストのリストを使用することができますndarrayの代わりにOPさんのコメント/リクエスト

アドレッシング

nr, nc = 3, 2 
axes_array = [[plt.subplot2grid((nr, nc), (r,c)) for c in range(nc)] for r in range(nr)] 

あなたは、この(未テスト、買主の危険負担)のように進むことができますタイトなレイアウト

plt.gcf().tight_layout() 
+0

の4番目の行を生成します。それをplt.subplot2grid()として定義するときに反復する方法はありますか? "AxesSubplot"オブジェクトは反復可能ではありません。 – Gabriel

+1

答えの最後に必要なコードを入れました、ciao – gboffi

関連する問題