web-dev-qa-db-ja.com

ループと関数を介してmatplotlibサブプロットにデータを入力する

ループの反復を通じて図のサブプロットを描画する必要があります。各反復は、別のモジュール(=別のpyファイル)で定義された関数を呼び出します。この関数は、サブプロットのペアを描画します。これが私が試したものです-そして悲しいかな、うまくいきません:

1)ループの前に、適切な行数と2列の図を作成します。

 import matplotlib.pyplot as plt     
 fig, axarr = plt.subplots(nber_rows,2)

2)ループ内で、反復番号iter_nberで、各サブプロットを描画する関数を呼び出します。

 fig, axarr = module.graph_function(fig,axarr,iter_nber,some_parameters, some_data)

3)問題の関数は基本的に次のようになります。各反復は、同じ行にサブプロットのペアを作成します。

 def graph_function(fig,axarr,iter_nber,some_parameters, some_data):

     axarr[iter_nber,1].plot(--some plotting 1--)
     axarr[iter_nber,2].plot(--some plotting 2--)

     return fig,axarr

これは動作しません。ループの終わりに空の図が表示されます。関数のreturn引数にaxarrだけを残すなど、上記のさまざまな組み合わせを試しましたが、役に立ちませんでした。明らかに、私はこの図とそのサブプロットの論理を理解していません。

どんな提案も大歓迎です。

9
Charles

あなたが投稿したコードはおおむね正しいようです。 @hitzgが述べたように、インデックス作成以外に、あなたがしていることは何も異常に見えません。

ただし、プロット関数からFigureとAxesの配列を返すことはあまり意味がありません。 (Figureオブジェクトにアクセスする必要がある場合は、いつでもax.figureから取得できます。)ただし、それらを渡して返すために何も変更されません。

これは、あなたがやろうとしているように聞こえるタイプの簡単な例です。多分それはいくつかの混乱を取り除くのに役立ちますか?

import numpy as np
import matplotlib.pyplot as plt

def main():
    nrows = 3
    fig, axes = plt.subplots(nrows, 2)

    for row in axes:
        x = np.random.normal(0, 1, 100).cumsum()
        y = np.random.normal(0, 0.5, 100).cumsum()
        plot(row, x, y)

    plt.show()

def plot(axrow, x, y):
    axrow[0].plot(x, color='red')
    axrow[1].plot(y, color='green')

main()

enter image description here

12
Joe Kington