2016-09-26 8 views
-1

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" 

Antwort

0

Ich denke, das einzige, was Sie brauchen eine neue Figur ist ... so versuchen plt.figure() rechts wie dies nach if figure == True: zu platzieren:

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

und sehen, ob es funktioniert.
Oder möchten Sie beide P und N Ergebnisse in einer Zahl haben? Dann müssen Sie mit Teilplots arbeiten, aber Sie müssen ein wenig mehr ändern.

+0

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 :-). –

+0

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

Verwandte Themen