2017-10-04 12 views
0

私は2つの図にプロットしています。これらの図には複数のサブプロットがあります。私はこれを単一のループの中で行う必要があります。ここで私は唯一の数字を持っているときに私は何をすべきかです:あなたはこのような何かをする必要があり、複数の数字がある場合1つのループに複数の図をサブプロットでプロットする

fig, ax = plt.subplots(nrows=6,ncols=6,figsize=(20, 20)) 
fig.subplots_adjust(hspace=.5,wspace=0.4) 
plt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=None) 

for x in range(1,32): 
    plt.subplot(6,6,x) 
    plt.title('day='+str(x)) 
    plt.scatter(x1,y1) 
    plt.scatter(x2,y2) 
    plt.colorbar().set_label('Distance from ocean',rotation=270) 
plt.savefig('Plots/everyday_D color.png')  
plt.close() 

は、今私は知っている:

fig1, ax1 = plt.subplots() 
fig2, ax2 = plt.subplots() 

をしかし、私はどのように知りませんループ内にプロットすると、各サブプロットがその場所にあります(2つの数字がある場合はplt.scatterを続けることができないため)。何が必要なのか(fig1.scatter、ax1.scatter、fig.subplots_adjust、...最後に保存して閉じる方法について)具体的に記述してください。

答えて

1

それぞれのpyplot関数には、オブジェクト指向APIにおける対応するメソッドあなたが本当に同時に両方の図の軸をループにしたい場合は、これは次のようになります。

import numpy as np 
import matplotlib.pyplot as plt 

x1 = x2 = np.arange(10) 
y1 = y2 = c = np.random.rand(10,6) 

fig1, axes1 = plt.subplots(nrows=2,ncols=3) 
fig1.subplots_adjust(hspace=.5,wspace=0.4) 

fig2, axes2 = plt.subplots(nrows=2,ncols=3) 
fig2.subplots_adjust(hspace=.5,wspace=0.4) 

for i, (ax1,ax2) in enumerate(zip(axes1.flatten(), axes2.flatten())): 
    ax1.set_title('day='+str(i)) 
    ax2.set_title('day='+str(i)) 
    sc1 = ax1.scatter(x1,y1[:,i], c=c[:,i]) 
    sc2 = ax2.scatter(x2,y2[:,i], c=c[:,i]) 
    fig1.colorbar(sc1, ax=ax1) 
    fig2.colorbar(sc2, ax=ax2) 

plt.savefig("plot.png") 
plt.show() 
plt.close() 

をここ2つの、扁平軸配列をループ、ax1ax2はにプロットするmatplotlib axesであるように、 。 fig1およびは、マトラプチドの数字(matplotlib.figure.Figure)である。

インデックスも取得するために、enumerateが使用されます。だから、ライン

for i, (ax1,ax2) in enumerate(zip(axes1.flatten(), axes2.flatten())): 
    # loop code 

は、両方の書き込みが長くなっている

for i in range(6): 
    ax1 = axes1.flatten()[i] 
    ax2 = axes2.flatten()[i] 
    # loop code 

または

i = 0 
for ax1,ax2 in zip(axes1.flatten(), axes2.flatten()): 
    # loop code 
    i += 1 

にここに相当します。

この時点で、オブジェクト指向APIを使用した上記の解決策は確かに汎用性が高く、望ましいことですが、純粋なパイプロットソリューションも可能です。これは、ここでは、2つの異なる図面上の散布図を実行する方法を示していたバージョンだ

import numpy as np 
import matplotlib.pyplot as plt 

x1 = x2 = np.arange(10) 
y1 = y2 = c = np.random.rand(10,6) 

plt.figure(1) 
plt.subplots_adjust(hspace=.5,wspace=0.4) 

plt.figure(2) 
plt.subplots_adjust(hspace=.5,wspace=0.4) 

for i in range(6): 
    plt.figure(1) 
    plt.subplot(2,3,i+1) 
    sc1 = plt.scatter(x1,y1[:,i], c=c[:,i]) 
    plt.colorbar(sc1) 

    plt.figure(2) 
    plt.subplot(2,3,i+1) 
    sc2 = plt.scatter(x1,y1[:,i], c=c[:,i]) 
    plt.colorbar(sc2) 

plt.savefig("plot.png") 
plt.show() 
plt.close() 
+0

あなたの答えをありがとう。列挙は、基本的にforループでインデックスを作成することを理解しています。だからax1とax2は単にインデックスですか?この例のどのタイプのオブジェクトax1、axes1、およびfig1が何であるか説明してください。 –

+0

'ax1'と' ax2'はmatplotlibの軸です。'enumerate'はループ内のインデックスを取得する簡単な方法です。たぶん[this](https://www.saltycrane.com/blog/2008/04/how-to-use-pythons-enumerate-and-zip-to/)は、より良い列挙を理解するのに役立ちます。私も答えを更新しました。 – ImportanceOfBeingErnest

1

ようになります。基本的に、plt.subplotsで作成された軸を参照します。

import matplotlib.pyplot as plt 
import numpy as np 

x1 = y1 = range(10) 
x2 = y2 = range(5) 

nRows = nCols = 6 
fig1, axesArray1 = plt.subplots(nrows=nRows,ncols=nCols,figsize=(20, 20)) 
fig1.subplots_adjust(hspace=.5,wspace=0.4) 
fig1.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=None) 

fig2, axesArray2 = plt.subplots(nrows=nRows,ncols=nCols,figsize=(20, 20)) 
fig2.subplots_adjust(hspace=.5,wspace=0.4) 
fig2.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=None) 

days = range(1, 32) 
dayRowCol = np.array([i + 1 for i in range(nRows * nCols)]).reshape(nRows, nCols) 
for day in days: 
    rowIdx, colIdx = np.argwhere(dayRowCol == day)[0] 

    axis1 = axesArray1[rowIdx, colIdx] 
    axis1.set_title('day=' + str(day)) 
    axis1.scatter(x1, y1) 

    axis2 = axesArray2[rowIdx, colIdx] 
    axis2.set_title('day=' + str(day)) 
    axis2.scatter(x2, y2) 

    # This didn't run in the original script, so I left it as is 
    # plt.colorbar().set_label('Distance from ocean',rotation=270) 

fig1.savefig('plots/everyday_D1_color.png') 
fig2.savefig('plots/everyday_D2_color.png') 
plt.close('all') 

私はポストplt.colorbar()から元のコードを取っエラーが発生したので、私は答えにそれを残しました。 colorbarがどのように動作するのかの例がある場合は、2桁の数字をどのようにして作成するかを見てみましょうが、残りのコードは意図したとおりに動作するはずです。

dayRolCol numpyにすべてが表示されない場合は、エラーを発生させます。どのように処理するかはあなた自身が決定します。また、numpyを使用することは、確かにそれを行う唯一の方法ではなく、私が快適な方法です。本当に必要なことは、特定の日/プロットを(x、y)のインデックスとリンクさせる方法を見つけることです。あなたがプロットしたい軸を指定します。

+0

回答がある場所で質問に答えた場合、あなたの場所がどのくらい離れているかを明確にするとよいでしょう。同じソリューションを2回使用するだけでは便利ではありません。また、もう一つの答えはカラーバーの使い方を示しているので、「私たち」がどのように動作するかを見ることができるとは思えません。 – ImportanceOfBeingErnest

+0

あなたの返事をありがとう。 1つの質問は、axis1とaxis2がどこから来たのかということです。あなたが以前紹介したaxesArray1への接続があるようには思われません(またはそれはちょうど間違いです)? –

+0

@ImportanceOfBeingErnestあなたが正しいと回答しましたが、私が答えを書いている間に他の答えが表示されました。 – Eric

関連する問題