11"""Plot radial profiles."""
22
33import matplotlib .pyplot as plt
4+ import numpy as np
45
56from . import conf , misc
7+ from ._step import Rprof
68from .stagyydata import StagyyData
79
810
9- def _plot_rprof_list (sdat , lovs , rprofs , metas , stepstr , rads = None ):
11+ def _plot_rprof_list (sdat , lovs , rprofs , stepstr ):
1012 """Plot requested profiles."""
11- if rads is None :
12- rads = {}
1313 for vfig in lovs :
1414 fig , axes = plt .subplots (ncols = len (vfig ), sharey = True ,
1515 figsize = (4 * len (vfig ), 6 ))
1616 axes = [axes ] if len (vfig ) == 1 else axes
1717 fname = 'rprof_'
1818 for iplt , vplt in enumerate (vfig ):
1919 xlabel = None
20- for ivar , rvar in enumerate ( vplt ):
21- fname += rvar + '_'
22- rad = rads [ rvar ]
20+ profs_on_plt = ( rprofs [ rvar ] for rvar in vplt )
21+ fname += '_' . join ( vplt ) + '_'
22+ for ivar , ( rprof , rad , meta ) in enumerate ( profs_on_plt ):
2323 if conf .rprof .depth :
2424 rad = rprofs ['bounds' ][1 ] - rad
25- axes [iplt ].plot (rprofs [ rvar ] , rad ,
25+ axes [iplt ].plot (rprof , rad ,
2626 conf .rprof .style ,
27- label = metas [ rvar ] .description )
27+ label = meta .description )
2828 if conf .rprof .depth :
2929 axes [iplt ].invert_yaxis ()
3030 if xlabel is None :
31- xlabel = metas [ rvar ] .kind
32- elif xlabel != metas [ rvar ] .kind :
31+ xlabel = meta .kind
32+ elif xlabel != meta .kind :
3333 xlabel = ''
3434 if ivar == 0 :
35- xlabel = metas [ rvar ] .description
35+ xlabel = meta .description
3636 if xlabel :
37- _ , unit = sdat .scale (1 , metas [ rvar ] .dim )
37+ _ , unit = sdat .scale (1 , meta .dim )
3838 if unit :
3939 xlabel += ' ({})' .format (unit )
4040 axes [iplt ].set_xlabel (xlabel )
@@ -102,7 +102,8 @@ def plot_average(sdat, lovs):
102102
103103 # assume constant z spacing for the moment
104104 for rvar in sovs :
105- rprof_averaged [rvar ], rads [rvar ], metas [rvar ] = step .rprofs [rvar ]
105+ rprof , rads [rvar ], metas [rvar ] = step .rprofs [rvar ]
106+ rprof_averaged [rvar ] = np .copy (rprof )
106107
107108 for step in steps_iter :
108109 nprofs += 1
@@ -111,14 +112,16 @@ def plot_average(sdat, lovs):
111112
112113 ilast = step .istep
113114 for rvar in sovs :
114- rprof_averaged [rvar ] /= nprofs
115+ # cast to float so that division happens in place
116+ rprof_averaged [rvar ] = Rprof (rprof_averaged [rvar ] / nprofs ,
117+ rads [rvar ], metas [rvar ])
115118 rcmb , rsurf = step .rprofs .bounds
116119 rprof_averaged ['bounds' ] = (step .sdat .scale (rcmb , 'm' )[0 ],
117120 step .sdat .scale (rsurf , 'm' )[0 ])
118121
119122 stepstr = '{}_{}' .format (istart , ilast )
120123
121- _plot_rprof_list (sdat , lovs , rprof_averaged , metas , stepstr , rads )
124+ _plot_rprof_list (sdat , lovs , rprof_averaged , stepstr )
122125
123126
124127def plot_every_step (sdat , lovs ):
@@ -136,17 +139,13 @@ def plot_every_step(sdat, lovs):
136139 sovs = misc .set_of_vars (lovs )
137140
138141 for step in sdat .walk .filter (rprofs = True ):
139- rprofs = {}
140- rads = {}
141- metas = {}
142- for rvar in sovs :
143- rprofs [rvar ], rads [rvar ], metas [rvar ] = step .rprofs [rvar ]
142+ rprofs = {rvar : step .rprofs [rvar ] for rvar in sovs }
144143 rcmb , rsurf = step .rprofs .bounds
145144 rprofs ['bounds' ] = (step .sdat .scale (rcmb , 'm' )[0 ],
146145 step .sdat .scale (rsurf , 'm' )[0 ])
147146 stepstr = str (step .istep )
148147
149- _plot_rprof_list (sdat , lovs , rprofs , metas , stepstr , rads )
148+ _plot_rprof_list (sdat , lovs , rprofs , stepstr )
150149
151150
152151def cmd ():
0 commit comments