2016-09-26 33 views
-1

我一直在爲我們在工作中的模型編寫一個後期處理腳本,該模型工作正常。最近我重新構建了腳本以確保清晰性和可重用性。python matplotlib酒吧多次運行腳本時不會改變

一般背景:對於每個「主參數」(N:nitrogen, P:phosporus),我們有一個pickle-stored數組作爲模型的輸出。在文件夾結構中,每subparameter/year/month有一堆醃製陣列。例如:N/RNO3_2010_03,是主要的參數N的子參數RNO3的2010年3月的結果

我在下面的腳本做的就是給一些參數的def()與陣列的文件夾上運行,收集信息並繪製圖表(可選將數據調查寫入CSV或爲視覺目的製作一些PNG保存)。

當我爲一個主參數運行此腳本(只有N設置爲True,或者只有P設置爲True,一切正常)。當我同時運行這兩個參數(NP均爲True)時,第二個參數的繪圖似乎與第一個參數的繪圖相同。我查了什麼可能導致它,但無法找到類似的問題。

我做的最後一件事是刪除p0,p1..。參數,因爲它們似乎是不更新的參數(或者在啓動新循環時保留最後一個輸入)。

感謝您的諮詢!

正確輸出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

我猜你唯一需要的是一個新的身影......所以嘗試把plt.figure()if figure == True:這樣之後:

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

,看看它是否工作。
或者你想在一個數字中同時出現P和N結果?那麼你需要和子圖一起工作,但是你需要改變一些。

+0

非常感謝!我測試了你的建議,而且確實有效,我已經不存在的問題了。我可以說我很放心:-)。 –

+0

不客氣,很高興聽到我可以幫忙!請接受答案(點擊選票旁邊的複選標記),以便人們可以看到問題已解決。 – swenzel