私は仕事中のモデルの後処理スクリプトを書いていますが、うまくいきました。最近、わかりやすく再利用できるようにスクリプトを再構成しました。スクリプトを複数回実行すると、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
のみが正しく設定されているだけです)、すべてがうまくいきます。これを両方のパラメータに対して同時に実行すると(N
とP
両方True
)、第2パラメータのプロットは第1パラメータのプロットと同じように見えます。私はそれを引き起こす可能性のあるものを見つけましたが、同様の問題を見つけることはできません。
私が最後にしたことは、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