2016-07-10 14 views
1

私はipythonノートブックを使用しています。次の関数を使用して、海底散布図をエクスポートしようとしています。関数を呼び出して一度に1つの変数で実行するとうまく動作します。ループ内で関数を呼び出すと、前の関数呼び出しのdistplotの上にビルドされ続けます。seaborn distplot loop lazy evaluation

私が望む出力は、関数がループで呼び出されるたびに新しい変位を出力することです。評価や新しいdistplotを強制する方法はありますか?

def graph_extraversion (x): 


    file_name = "extraversion_" + str(x) + ".png" 
    sns_plot = sns.distplot(Personalities[Personalities.labels1 ==x].extraversion) 
    sns_plot = sns.distplot(df.extraversion) 
    fig = sns_plot.get_figure() 
    fig.savefig(file_name) 
    new_stat = Personalities[Personalities.labels1 ==x].extraversion.describe() 
    extraversion_drift = extraversion_median - new_stat[1] 
    drift = extraversion_drift/extraversion_std 
    if (drift >= 1) | (drift <= -1): 
     return "1 std deviation or more" 
    else: 
     return "Less than one std deviation" 

これはdistplotは1つのコール

enter image description here

これは、2つのコール後に、ループ内での後のように見えるものものです。

enter image description here

これも単一の呼び出しと実行とうまく動作しますが、ループしたときに、それが構築し続けます。

+0

をmatplotlibの必要がありますhttp://stackoverflow.com/questions/23969619/plotting-with-seaborn-using-the-plotlib-object-oriented-interfaceを参照してください。 – mwaskom

+0

投稿を見ましたが、呼び出し側に関数を返し、ループ内で新しい図をインスタンス化する方法があります。 –

答えて

1

これは、matplotlibとclosing figuresと関係があります。

追加コード必要はインポートです:

import matplotlib.pyplot as plt 

そして、FUNCの終わり:

plt.close(fig) 

これは、任意の両方seabornでルーピングを支援し、あなたが望むこと

+1

追加のインポートは不要で、 'fig.close()'だけです。図形オブジェクトを使用する方がこれをより受け入れやすい方法に見えるでしょう。 – pbreach