2016-09-26 8 views
-1

私は仕事中のモデルの後処理スクリプトを書いていますが、うまくいきました。最近、わかりやすく再利用できるようにスクリプトを再構成しました。スクリプトを複数回実行すると、python matplotlibのバーが変わらない

一般的な背景:各「主パラメータ」(N:nitrogen, P:phosporus)に対して、モデルからの出力としてpickle-stored配列があります。フォルダ構造にsubparameter/year/monthごとに複数のピクルドアレイがあります。例えば:N/RNO3_2010_03、私は以下のスクリプトで行うことは情報を収集し、配列にフォルダ上で実行するためにdef()にいくつかのパラメータを与えている主なパラメータNのサブパラメータRNO3の2010年3月

結果であり、チャートをプロットする(オプションでデータの調査をCSVに書き込むか、視覚的にPNG保存する)。

1つのメインパラメータに対してこのスクリプトを実行すると(NがTrueに設定されているか、またはPのみが正しく設定されているだけです)、すべてがうまくいきます。これを両方のパラメータに対して同時に実行すると(NP両方True)、第2パラメータのプロットは第1パラメータのプロットと同じように見えます。私はそれを引き起こす可能性のあるものを見つけましたが、同様の問題を見つけることはできません。

私が最後にしたことは、p0p1..を削除することでした。パラメータは更新されない(または新しいループを開始するときに最後の入力を保存したままにしておく)ように見えるためです。

ありがとうございました!

Nの正しい出力の例(申し訳ありませんが、1つの画像しかアップロードできません)。

import numpy as np 
import csv 
import pickle 
import matplotlib.pyplot as plt 
import matplotlib 
# Fill in settings below ! -------------------------------------------------------------------- 
path = "Z:/Modellering/2_ArcNemo/OutputArcNEMO/Rob/Nete20002012_20160802145344/" 
bekken = "Nete" 
N = True #set this True if you want to proces data for N, else False 
P = True #set this True if you want to proces data for P, else False 
RES = True #set this True if you want to proces data for residue, else False 
data = False #set this True if you want to write processed data to a file (csv), else False 
figure = True #set this True if you want to visualise processed data in a figure (png) 
save_png= False #set this True if you want to save a png of every array of RES, else False 
years = ["2010","2011","2012"] #copy-paste the wanted years from below into this list 
#"2000","2001","2002","2003","2004","2005","2006","2007","2008","2009","2010","2011","2012","2013","2014","2015","2016","2017","2018","2019","2020","2021" 
#Fill in the above settings ! ------------------------------------------------------------------ 
parametersN = [N,"N",["DrNO3","RNO3","RNorg"],500000] 
parametersP = [P,"P",["DroP","RoP","RPorg","RPsor"],5000] 
#parametersRES = ["NS30","NS60","NS90"] 
months = ["01","02","03","04","05","06","07","08","09","10","11","12"] 
save = "overzicht.csv" 
def process(parameters): 
    dates = [] 
    max_par = 0 
    S = 0 
    par0_dat = [] 
    par1_dat = [] 
    par2_dat = [] 
    par3_dat = [] 
    result = [] 
    if parameters[0]: 
     saved = path + str(parameters[1]) + save 
     parameters_list = parameters[2] 
     j=0 
     for par in parameters_list: 
      for y in years: 
       for m in months: 
        to_load = path+str(parameters[1])+"/"+par+"_"+y+"_"+m 
        array = pickle.load(open(str(to_load),"rb")) 
        sum_par = np.sum(pickle.load(open(str(to_load),"rb")))/1000 
        if save_png: 
         save_img = path+par+"_"+y+"_"+m+".png" 
         matplotlib.image.imsave(save_img, array) 
        if figure==True: 
         dates.append(str(m)+"/"+str(y)) 
         if j==0: 
          par0_dat.append(sum_par) 
         if j==1: 
          par1_dat.append(sum_par) 
         if j==2: 
          par2_dat.append(sum_par) 
         if j==3: 
          par3_dat.append(sum_par) 
        if data==True: 
         result.append(str(par)) 
         d = str(m) + "_" + str(y) 
         result.append(d) 
         result.append(str(sum_par)) 
         with open(saved, 'ab') as f: 
          w = csv.writer(f, delimiter = ",") 
          w.writerow(result) 
          result = [] 
      j+=1 
     if figure==True: 
      S = len(dates)/len(parameters[2]) 
      if parameters[1]!="P": 
       par3_dat = [0]*S 
      for i in range(0, S): 
       if (par0_dat[i] + par1_dat[i] + par2_dat[i] + par3_dat[i]) > max_par: 
        max_par = par0_dat[i] + par1_dat[i] + par2_dat[i] + par3_dat[i] 
      ind = np.arange(S) 
      width = 0.6 
      p1 = plt.bar(ind, par0_dat, width, color='r') 
      p2 = plt.bar(ind, par1_dat, width, color='y',bottom=par0_dat) 
      p3 = plt.bar(ind, par2_dat, width, color='b',bottom=[par0_dat[k]+par1_dat[k] for k in range(len(par0_dat))]) 
      p4 = plt.bar(ind, par3_dat, width, color='k',bottom=[par0_dat[l]+par1_dat[l]+par2_dat[l] for l in range(len(par0_dat))]) 
      if parameters[1]!="P": 
       plt.legend((p1[0], p2[0], p3[0]), (parameters[2][0], parameters[2][1] , parameters[2][2])) 
      else: 
       plt.legend((p1[0], p2[0], p3[0], p4[0]), (parameters[2][0], parameters[2][1] , parameters[2][2], parameters[2][3])) 
      title = parameters[1] + "t netto-emissies " + bekken + " " + str(years[0]) +" - " + str(years[len(years)-1]) 
      plt.title(title) 
      plt.ylabel("kg " + parameters[1] + "/mnd") 
      plt.xticks(ind + width/2., dates) 
      plt.xticks(rotation=90, fontsize=7) 
      plt.yticks(np.arange(0, max_par, parameters[3])) 
      plt.tight_layout() 
      plt.savefig(path+ str(parameters[1]) +".png") 
      print str(p1) 
      print p1 
      del p1 
      del p2 
      del p3 
      del p4 
      parameters = [] 
process(parametersN) 
process(parametersP) 
print "Done" 

答えて

0

私は右のこのようなif figure == True:plt.figure()を配置してみてください...あなたが必要とする唯一のものは、新規の図であり、推測:

 ... 
     j+=1 
    if figure==True: 
     plt.figure() 
     S = len(dates)/len(parameters[2]) 
     ... 

、それが動作するかどうかを確認。
または、1つの図にPとNの両方の結果を表示したいですか?その後、サブプロットで作業する必要がありますが、もう少し変更する必要があります。

+0

ありがとうございます!私はあなたの提案をテストし、私は確かに動作します、私はもはや存在していた問題はありません。私はかなり安心できると言うことができます:-)。 –

+0

私はお手伝いできることを歓迎します。問題が解決されたことを人々が見られるように、回答を受け入れてください(票の横にあるチェックマークをクリックしてください)。 – swenzel

関連する問題