Ich habe ein Post-Processing-Skript für ein Modell geschrieben, das wir bei der Arbeit haben, was gut funktioniert hat. Vor kurzem habe ich das Skript für Klarheit und Wiederverwendbarkeit neu strukturiert.Python-Matplotlib-Balken ändern sich nicht, wenn Skript mehrmals ausgeführt wird
Allgemeiner Hintergrund: Wir haben Pickle-gespeicherte Arrays als Ausgabe von einem Modell, für jeden "Hauptparameter" (N:nitrogen, P:phosporus)
. Es gibt eine Reihe von gebeizten Arrays pro subparameter/year/month
in einer Ordnerstruktur. ZB: N/RNO3_2010_03
, ist das Ergebnis für den Monat März 2010 des Subparameters RNO3
des Hauptparameter N.
Was ich im Skript zu tun ist unten einige Parameter geben an ein def()
über den Ordner mit dem Arrays laufen, sammelt die Informationen und zeichnen Sie ein Diagramm (optional schreiben Sie eine Umfrage der Daten in CSV oder machen Sie einige PNG speichert für visuelle Zwecke).
Wenn ich dieses Skript für einen Hauptparameter ausführen (nur N
auf True gesetzt, oder nur P
auf True gesetzt, alles geht gut). Wenn ich dies für beide Parameter gleichzeitig ausführe (N
und P
beide True
), scheint das Diagramm für die zweiten Parameter dasselbe wie das Diagramm für den ersten Parameter zu sein. Ich habe nachgeschaut, was das verursachen könnte, aber ich kann kein ähnliches Problem finden.
Das letzte, was ich tat, löschte die p0
, p1..
. Parameter, da sie scheinbar nicht aktualisiert werden (oder die letzte gespeicherte Eingabe beim Start einer neuen Schleife beibehalten werden).
Vielen Dank für Ihren Hinweis!
Beispiel für eine korrekte Ausgabe für N (leider kann ich nur 1 Bild hochladen).
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"
Vielen Dank! Ich habe deinen Vorschlag getestet und ich arbeite tatsächlich, das Problem, das ich hatte, existiert nicht mehr. Ich kann sagen, dass ich ziemlich erleichtert bin :-). –
Gern geschehen, schön zu hören, ich könnte helfen! Bitte akzeptieren Sie die Antwort (klicken Sie auf das Häkchen neben den Stimmen), damit die Leute sehen können, dass das Problem gelöst wurde. – swenzel