Ignore:
Timestamp:
03/13/15 16:21:21 (8 years ago)
Author:
labetoulle
Message:

Add plot_bilan_jobs.py and do some cleaning

File:
1 edited

Legend:

Unmodified
Added
Removed
  • TOOLS/ConsoGENCMIP6/bin/plot_bilan.py

    r2434 r2437  
    1818 
    1919######################################## 
    20 class BilanDict(dict): 
     20class DataDict(dict): 
    2121  #--------------------------------------- 
    2222  def __init__(self): 
     
    4545        filein, 
    4646        skip_header=1, 
    47         converters={0: string_to_date, 
    48                     1: string_to_float, 
    49                     2: string_to_percent, 
    50                     3: string_to_percent}, 
     47        converters={ 
     48          0: string_to_date, 
     49          1: string_to_float, 
     50          2: string_to_percent, 
     51          3: string_to_percent, 
     52          4: string_to_float, 
     53          5: string_to_float, 
     54          6: string_to_float, 
     55          7: string_to_float, 
     56        }, 
    5157        missing_values="nan", 
    5258      ) 
    53     except: 
    54       print("Empty file {}".format(filein)) 
     59    except Exception as rc: 
     60      print("Empty file {}:\n{}".format(filein, rc)) 
    5561      exit(1) 
    5662 
    57     for date, conso, real_use, theo_use in data: 
     63    for date, conso, real_use, theo_use, \ 
     64        run_mean, pen_mean, run_std, pen_std in data: 
    5865      if date in self: 
    59         self.add_item(date, conso, real_use, theo_use) 
     66        self.add_item( 
     67          date, 
     68          conso, 
     69          real_use, 
     70          theo_use, 
     71          run_mean, 
     72          pen_mean, 
     73          run_std, 
     74          pen_std, 
     75        ) 
    6076        self[date].fill() 
    6177 
    6278  #--------------------------------------- 
    6379  def add_item(self, date, conso=np.nan, 
    64                real_use=np.nan, theo_use=np.nan): 
    65     """ 
    66     """ 
    67     self[date] = Conso(date, conso, real_use, theo_use) 
     80               real_use=np.nan, theo_use=np.nan, 
     81               run_mean=np.nan, pen_mean=np.nan, 
     82               run_std=np.nan, pen_std=np.nan): 
     83    """ 
     84    """ 
     85    self[date] = Conso(date, conso, real_use, theo_use, 
     86                       run_mean, pen_mean, run_std, pen_std) 
    6887 
    6988  #--------------------------------------- 
     
    136155  #--------------------------------------- 
    137156  def __init__(self, date, conso=np.nan, 
    138                real_use=np.nan, theo_use=np.nan): 
     157               real_use=np.nan, theo_use=np.nan, 
     158               run_mean=np.nan, pen_mean=np.nan, 
     159               run_std=np.nan, pen_std=np.nan): 
    139160    self.date     = date 
    140161    self.conso    = conso 
     
    142163    self.theo_use = theo_use 
    143164    self.theo_equ = np.nan 
     165    self.run_mean = run_mean 
     166    self.pen_mean = pen_mean 
     167    self.run_std  = run_std 
     168    self.pen_std  = pen_std 
    144169    self.filled   = False 
    145170 
     
    167192 
    168193######################################## 
    169 def plot_data(ax_conso, ax_theo, xcoord, xlabels, 
    170               consos, conso_per_day, theo_uses, real_uses, theo_equs): 
     194def plot_data(ax_conso, ax_theo, xcoord, dates, 
     195              consos, theo_uses, real_uses, theo_equs, 
     196              run_mean, pen_mean, run_std, pen_std): 
    171197  """ 
    172198  """ 
     199  line_style = "-" 
    173200  if args.full: 
    174     line_style = "-" 
     201    line_width = 0.05 
     202  else: 
     203    # line_style = "+-" 
    175204    line_width = 0.1 
    176   else: 
    177     line_style = "+-" 
    178     line_width = 0.2 
    179  
    180   ax_conso.bar(xcoord, consos, align="center", color="linen", 
     205 
     206  ax_conso.bar(xcoord, consos, width=1, align="center", color="linen", 
    181207               linewidth=line_width, label="conso (heures)") 
    182   ax_conso.axhline(y=conso_per_day, color="blue", alpha=0.5, 
    183                    label="conso journaliÚre idéale (heures)") 
    184208 
    185209  ax_theo.plot(xcoord, theo_equs, "--", 
     
    188212  ax_theo.plot(xcoord, theo_uses, line_style, color="firebrick", 
    189213               linewidth=1, markersize=8, 
    190                # solid_capstyle="round", solid_joinstyle="round", 
     214               solid_capstyle="round", solid_joinstyle="round", 
    191215               label="conso théorique (%)") 
    192216  ax_theo.plot(xcoord, real_uses, line_style, color="forestgreen", 
    193217               linewidth=1, markersize=8, 
    194                # solid_capstyle="round", solid_joinstyle="round", 
     218               solid_capstyle="round", solid_joinstyle="round", 
    195219               label="conso réelle (%)") 
    196220 
    197221 
    198222######################################## 
    199 def plot_config(ax_conso, ax_theo, xcoord, xlabels, ymax, title, conso_per_day): 
     223def plot_config(fig, ax_conso, ax_theo, xcoord, dates, title, conso_per_day): 
    200224  """ 
    201225  """ 
     
    203227  # ------------------- 
    204228  # 1) Range 
     229  if args.max: 
     230    ymax = gencmip6.alloc 
     231  else: 
     232    ymax = np.nanmax(consos) + np.nanmax(consos)*.1 
     233 
    205234  xmin, xmax = xcoord[0]-1, xcoord[-1]+1 
    206235  ax_conso.set_xlim(xmin, xmax) 
     
    209238 
    210239  # 2) Ticks labels 
    211   inc_label = 7 if nb_items > 37 else 1 
     240  (date_beg, date_end) = (dates[0], dates[-1]) 
     241  date_fmt = "{:%d-%m}" 
     242 
     243  if date_end - date_beg > dt.timedelta(weeks=9): 
     244    maj_xticks = [x for x, d in zip(xcoord, dates) 
     245                     if d.weekday() == 0] 
     246    maj_xlabs  = [date_fmt.format(d) for d in dates 
     247                     if d.weekday() == 0] 
     248  else: 
     249    maj_xticks = [x for x, d in zip(xcoord, dates)] 
     250    maj_xlabs  = [date_fmt.format(d) for d in dates] 
     251 
    212252  ax_conso.ticklabel_format(axis="y", style="sci", scilimits=(0, 0)) 
     253 
    213254  ax_conso.set_xticks(xcoord, minor=True) 
    214   ax_conso.set_xticks(xcoord[::inc_label], minor=False) 
    215   ax_conso.set_xticklabels( 
    216     xlabels[::inc_label], rotation="45", size="x-small" 
    217   ) 
     255  ax_conso.set_xticks(maj_xticks, minor=False) 
     256  ax_conso.set_xticklabels(maj_xlabs, rotation="vertical", size="x-small") 
    218257 
    219258  yticks = list(ax_conso.get_yticks()) 
     
    221260  ax_conso.set_yticks(yticks) 
    222261 
     262  ax_conso.axhline(y=conso_per_day, color="blue", alpha=0.5, 
     263                   label="conso journaliÚre idéale (heures)") 
     264 
     265  for x, d in zip(xcoord, dates): 
     266    if d.weekday() == 0 and d.hour == 0: 
     267      ax_conso.axvline(x=x, color="black", alpha=0.5, 
     268                       linewidth=0.5, linestyle=":") 
     269 
    223270  # 3) Define axes title 
    224   ax_conso.set_ylabel("heures", fontweight="bold") 
    225   ax_theo.set_ylabel("%", fontweight="bold") 
     271  for ax, label in ( 
     272    (ax_conso, "heures"), 
     273    (ax_theo, "%"), 
     274  ): 
     275    ax.set_ylabel(label, fontweight="bold") 
     276    ax.tick_params(axis="y", labelsize="small") 
     277 
     278  # 4) Define plot size 
     279  fig.subplots_adjust( 
     280    left=0.08, 
     281    bottom=0.09, 
     282    right=0.93, 
     283    top=0.93, 
     284  ) 
    226285 
    227286  # ... Main title and legend ... 
    228287  # ----------------------------- 
    229   ax_conso.set_title(title, fontweight="bold", size="large") 
    230   ax_theo.legend(loc="upper right", fontsize="x-small", frameon=False) 
    231   ax_conso.legend(loc="upper left", fontsize="x-small", frameon=False) 
    232  
    233  
    234 # ######################################## 
    235 # def plot_save(img_name, titre): 
    236 #   """ 
    237 #   """ 
    238 #   dpi = 200. 
    239  
    240 #   img_in  = os.path.join(DIR["PLOT"], "{}.pdf".format(img_name)) 
    241  
    242 #   with PdfPages(img_in) as pdf: 
    243 #     pdf.savefig(dpi=dpi) 
    244  
    245 #     # pdf file's metadata 
    246 #     d = pdf.infodict() 
    247 #     d["Title"]   = titre 
    248 #     d["Author"]  = os.path.basename(__file__) 
    249 #     # d["Subject"] = "Time spent over specific commands during create_ts \ 
    250 #     #                 jobs at IDRIS and four configurations at TGCC" 
    251 #     # d["Keywords"] = "bench create_ts TGCC IDRIS ncrcat" 
    252 #     # d["CreationDate"] = dt.datetime(2009, 11, 13) 
    253 #     # d["ModDate"] = dt.datetime.today() 
    254  
    255 #   if os.path.isdir(DIR["SAVEPLOT"]): 
    256 #     img_out = os.path.join(DIR["SAVEPLOT"], 
    257 #                            "{}_{}.pdf".format(img_name, today)) 
    258 #     shutil.copy(img_in, img_out) 
     288  fig.suptitle(title, fontweight="bold", size="large") 
     289  for ax, loc in ( 
     290    (ax_conso, "upper left"), 
     291    (ax_theo, "upper right"), 
     292  ): 
     293    ax.legend(loc=loc, fontsize="x-small", frameon=False) 
    259294 
    260295 
     
    327362  gencmip6.get_date_init(file_utheo) 
    328363 
    329   # .. Fill in conso data .. 
    330   # ======================== 
     364  # .. Fill in data .. 
     365  # ================== 
    331366  # ... Initialization ... 
    332367  # ---------------------- 
    333   bilan = BilanDict() 
     368  bilan = DataDict() 
    334369  bilan.init_range(gencmip6.date_init, gencmip6.deadline) 
    335370  # ... Extract data from file ... 
     
    356391 
    357392  xcoord    = np.linspace(1, nb_items, num=nb_items) 
    358   xlabels   = ["{:%d-%m}".format(item.date) 
    359                for item in selected_items] 
     393  dates   = [item.date for item in selected_items] 
     394 
    360395  cumul     = np.array([item.conso for item in selected_items], 
    361396                        dtype=float) 
     
    374409                       dtype=float) 
    375410 
     411  run_mean = np.array([item.run_mean for item in selected_items], 
     412                       dtype=float) 
     413  pen_mean = np.array([item.pen_mean for item in selected_items], 
     414                       dtype=float) 
     415  run_std  = np.array([item.run_std for item in selected_items], 
     416                       dtype=float) 
     417  pen_std  = np.array([item.pen_std for item in selected_items], 
     418                       dtype=float) 
     419 
    376420  # .. Plot stuff .. 
    377421  # ================ 
     
    382426  # ... Plot data ... 
    383427  # ----------------- 
    384   plot_data(ax_conso, ax_theo, xcoord, xlabels, 
    385             consos, conso_per_day, theo_uses, real_uses, theo_equs) 
     428  plot_data(ax_conso, ax_theo, xcoord, dates, 
     429            consos, theo_uses, real_uses, theo_equs, 
     430            run_mean, pen_mean, run_std, pen_std) 
    386431 
    387432  # ... Tweak figure ... 
    388433  # -------------------- 
    389   if args.max: 
    390     ymax = gencmip6.alloc 
    391   else: 
    392     ymax = np.nanmax(consos) + np.nanmax(consos)*.1 
    393  
    394434  title = "Consommation {}\n({:%d/%m/%Y} - {:%d/%m/%Y})".format( 
    395435    gencmip6.project.upper(), 
     
    398438  ) 
    399439 
    400   plot_config(ax_conso, ax_theo, xcoord, xlabels, ymax, title, conso_per_day) 
     440  plot_config(fig, ax_conso, ax_theo, xcoord, dates, title, conso_per_day) 
    401441 
    402442  # ... Save figure ... 
Note: See TracChangeset for help on using the changeset viewer.