我一直在爲我們在工作中的模型編寫一個後期處理腳本,該模型工作正常。最近我重新構建了腳本以確保清晰性和可重用性。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,一切正常)。當我同時運行這兩個參數(N
和P
均爲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"
非常感謝!我測試了你的建議,而且確實有效,我已經不存在的問題了。我可以說我很放心:-)。 –
不客氣,很高興聽到我可以幫忙!請接受答案(點擊選票旁邊的複選標記),以便人們可以看到問題已解決。 – swenzel