From b03f121fc7dd0525333f9b962d3260bc4faef246 Mon Sep 17 00:00:00 2001 From: hvasbath Date: Wed, 24 Aug 2022 11:46:19 +0200 Subject: [PATCH 1/6] plotting.marginals: use plot-projections to choose type of traceplot, add cdf --- beat/apps/beat.py | 4 ++-- beat/plotting/common.py | 47 ++++++++++++++++++++++++++++++++++---- beat/plotting/marginals.py | 26 ++++++++++++++++++--- 3 files changed, 67 insertions(+), 10 deletions(-) diff --git a/beat/apps/beat.py b/beat/apps/beat.py index 125ef65c..cfc16f7b 100644 --- a/beat/apps/beat.py +++ b/beat/apps/beat.py @@ -1782,8 +1782,8 @@ def setup(parser): dest="plot_projection", # choices=['latlon', 'local', 'individual'], default="local", - help='Output projection of the plot; "latlon" or "local"' - 'Default: "local"', + help='Output projection of the plot; "latlon" or "local" for maps - Default: "local";' + ' "pdf", "cdf" or "kde" for stage_posterior plot - Default: "pdf"', ) parser.add_option( diff --git a/beat/plotting/common.py b/beat/plotting/common.py index fd813dcc..51a6320c 100644 --- a/beat/plotting/common.py +++ b/beat/plotting/common.py @@ -306,6 +306,9 @@ def histplot_op( """ Modified from pymc3. Additional color argument. """ + + cumulative = kwargs.pop("cumulative", "False") + if color is not None and cmap is not None: logger.debug("Using color for histogram edgecolor ...") @@ -317,11 +320,15 @@ def histplot_op( histtype = "bar" else: - histtype = "stepfilled" + if not cumulative: + histtype = "stepfilled" + else: + histtype = "step" for i in range(data.shape[1]): d = data[:, i] quants = quantiles(d, qlist=qlist) + mind = quants[qlist[0]] maxd = quants[qlist[-1]] @@ -332,15 +339,16 @@ def histplot_op( if tstd is None: tstd = num.std(d) - step = ((maxd - mind) / 40.0).astype(tconfig.floatX) + if bins is None: + step = ((maxd - mind) / 40).astype(tconfig.floatX) - if step == 0: - step = num.finfo(tconfig.floatX).eps + if step == 0: + step = num.finfo(tconfig.floatX).eps - if bins is None: bins = int(num.ceil((maxd - mind) / step)) if bins == 0: bins = 10 + major, minor = get_matplotlib_version() if major < 3: kwargs["normed"] = True @@ -356,6 +364,7 @@ def histplot_op( histtype=histtype, color=color, edgecolor=color, + cumulative=cumulative, **kwargs ) @@ -379,6 +388,34 @@ def histplot_op( rightb = num.maximum(rightb, right) ax.set_xlim(leftb, rightb) + if cumulative: + # need left plot bound, leftb + sigma_quants = quantiles(d, [5, 68, 95]) + + for quantile, value in sigma_quants.items(): + quantile /= 100.0 + x = [leftb, value, value] + y = [quantile, quantile, 0.0] + + ax.plot(x, y, "--k", linewidth=0.5) + fontsize = 6 + ax.text( + (value - num.abs(leftb)) / 2, + quantile, + "{}%".format(int(quantile * 100)), + fontsize=fontsize, + horizontalalignment="center", + verticalalignment="bottom", + ) + # if quantile > 0.3: + ax.text( + value, + quantile / 2, + "%.2f" % value, + fontsize=fontsize, + horizontalalignment="left", + verticalalignment="bottom", + ) def kde2plot_op(ax, x, y, grid=200, **kwargs): diff --git a/beat/plotting/marginals.py b/beat/plotting/marginals.py index bae91b2c..c686f67b 100644 --- a/beat/plotting/marginals.py +++ b/beat/plotting/marginals.py @@ -353,7 +353,11 @@ def remove_var(varnames, varname): # axs[rowi, coli].set_ylim([0, e.max()]) xticker = MaxNLocator(nbins=5) xax.set_major_locator(xticker) - elif plot_style == "hist": + elif plot_style in ["pdf", "cdf"]: + + if plot_style == "cdf": + kwargs["cumulative"] = True + histplot_op( axs[rowi, coli], e, @@ -759,9 +763,24 @@ def draw_posteriors(problem, plot_options): Identify which stage is the last complete stage and plot posteriors. """ + plot_style_choices = ["pdf", "cdf", "kde", "local"] + hypers = utility.check_hyper_flag(problem) po = plot_options + if po.plot_projection in plot_style_choices: + if po.plot_projection == "local": + plot_style = "pdf" + nbins = 40 + else: + plot_style = po.plot_projection + nbins = 200 + else: + raise ValueError( + "Supported plot-projections are: %s" + % utility.list2string(plot_style_choices) + ) + stage = Stage( homepath=problem.outfolder, backend=problem.config.sampler_config.backend ) @@ -792,7 +811,7 @@ def draw_posteriors(problem, plot_options): outpath = os.path.join( problem.outfolder, po.figure_dir, - "stage_%i_%s_%s.%s" % (s, sidxs, po.post_llk, po.outformat), + "stage_%i_%s_%s_%s.%s" % (s, sidxs, po.post_llk, plot_style, po.outformat), ) if not os.path.exists(outpath) or po.force: @@ -816,10 +835,11 @@ def draw_posteriors(problem, plot_options): chains=None, combined=True, source_idxs=po.source_idxs, - plot_style="hist", + plot_style=plot_style, lines=po.reference, posterior=po.post_llk, prior_bounds=prior_bounds, + nbins=nbins, ) if not po.outformat == "display": From f76b79c2c346c5341bad6ece58a1a704b97b3575 Mon Sep 17 00:00:00 2001 From: hvasbath Date: Fri, 26 Aug 2022 13:19:18 +0200 Subject: [PATCH 2/6] plotting.marginals: Traceplot fix plotsize to fractions of A4, multipage --- beat/plotting/common.py | 10 +- beat/plotting/geodetic.py | 2 +- beat/plotting/marginals.py | 418 +++++++++++++++++++++---------------- 3 files changed, 243 insertions(+), 187 deletions(-) diff --git a/beat/plotting/common.py b/beat/plotting/common.py index 51a6320c..af0332fe 100644 --- a/beat/plotting/common.py +++ b/beat/plotting/common.py @@ -308,6 +308,7 @@ def histplot_op( """ cumulative = kwargs.pop("cumulative", "False") + labels = kwargs.pop("label", None) if color is not None and cmap is not None: logger.debug("Using color for histogram edgecolor ...") @@ -355,6 +356,8 @@ def histplot_op( else: kwargs["density"] = True + label = labels[i] + n, outbins, patches = ax.hist( d, bins=bins, @@ -365,6 +368,7 @@ def histplot_op( color=color, edgecolor=color, cumulative=cumulative, + label=label, **kwargs ) @@ -399,8 +403,10 @@ def histplot_op( ax.plot(x, y, "--k", linewidth=0.5) fontsize = 6 + xval = (value - num.abs(leftb)) / 2 + leftb + ax.text( - (value - num.abs(leftb)) / 2, + xval, quantile, "{}%".format(int(quantile * 100)), fontsize=fontsize, @@ -411,7 +417,7 @@ def histplot_op( ax.text( value, quantile / 2, - "%.2f" % value, + "%.3f" % value, fontsize=fontsize, horizontalalignment="left", verticalalignment="bottom", diff --git a/beat/plotting/geodetic.py b/beat/plotting/geodetic.py index 36d4ef38..60521dbb 100644 --- a/beat/plotting/geodetic.py +++ b/beat/plotting/geodetic.py @@ -1006,7 +1006,7 @@ def draw_scene_fits(problem, plot_options): % (stage.number, llk_str, po.plot_projection, po.nensemble), ) - if not os.path.exists(outpath) or po.force: + if not os.path.exists(outpath + ".%s" % po.outformat) or po.force: figs = scene_fits(problem, stage, po) else: logger.info("scene plots exist. Use force=True for replotting!") diff --git a/beat/plotting/marginals.py b/beat/plotting/marginals.py index c686f67b..b969bf9f 100644 --- a/beat/plotting/marginals.py +++ b/beat/plotting/marginals.py @@ -5,6 +5,8 @@ import numpy as num from matplotlib import pyplot as plt from matplotlib.ticker import MaxNLocator +from matplotlib.backends.backend_pdf import PdfPages + from pymc3 import plots as pmp from pymc3 import quantiles from pyrocko.cake_plot import str_to_mpl_color as scolor @@ -81,6 +83,13 @@ def extract_type_range(ax, varname, unities): def apply_unified_axis( axs, varnames, unities, axis="x", ntickmarks_max=3, scale_factor=2 / 3 ): + naxs = axs.size + nvars = len(varnames) + if naxs != nvars: + logger.debug( + "Inconsistenet number of Axes: %i and variables: %i!" % (naxs, nvars) + ) + for ax, v in zip(axs.ravel("F"), varnames): if v in utility.grouped_vars: for setname, varrange in unities.items(): @@ -125,7 +134,6 @@ def traceplot( trace, varnames=None, transform=lambda x: x, - figsize=None, lines={}, chains=None, combined=False, @@ -138,9 +146,7 @@ def traceplot( priors=None, prior_alpha=1, prior_style="--", - axs=None, posterior=None, - fig=None, plot_style="kde", prior_bounds={}, unify=True, @@ -162,8 +168,6 @@ def traceplot( Function to transform data (defaults to identity) posterior : str To mark posterior value in distribution 'max', 'min', 'mean', 'all' - figsize : figure size tuple - If None, size is (12, num of variables * 2) inch lines : dict Dictionary of variable name / value to be overplotted as vertical lines to the posteriors and horizontal lines on sample values @@ -186,10 +190,6 @@ def traceplot( mpl color tuple alpha : float Alpha value for plot line. Defaults to 0.35. - axs : axes - Matplotlib axes. Defaults to None. - fig : figure - Matplotlib figure. Defaults to None. unify : bool If true axis units that belong to one group e.g. [km] will have common axis increments @@ -248,24 +248,17 @@ def remove_var(varnames, varname): "max": scolor("scarletred2"), } - n = len(varnames) - nrow = int(num.ceil(n / 2.0)) - ncol = 2 - - n_fig = nrow * ncol - if figsize is None: - if n < 5: - figsize = mpl_papersize("a6", "landscape") - elif n < 7: - figsize = mpl_papersize("a5", "portrait") - else: - figsize = mpl_papersize("a4", "portrait") - - if axs is None: - fig, axs = plt.subplots(nrow, ncol, figsize=figsize) - axs = num.atleast_2d(axs) - elif axs.shape != (nrow, ncol): - raise TypeError("traceplot requires n*2 subplots %i, %i" % (nrow, ncol)) + n = nvar = len(varnames) + if n == 1 and len(source_idxs) > 1: + n = len(source_idxs) + logger.info("Plotting of patches in panels ...") + varnames = varnames * n + elif n == 1 and source_idxs is None: + raise IOError( + "If only single variable is selected source_idxs need to be specified!" + ) + else: + logger.info("Plotting variables in panels ...") if varbins is None: make_bins_flag = True @@ -274,166 +267,218 @@ def remove_var(varnames, varname): make_bins_flag = False input_color = copy.deepcopy(color) - for i in range(n_fig): - coli, rowi = utility.mod_i(i, nrow) - - if i > len(varnames) - 1: - try: - fig.delaxes(axs[rowi, coli]) - except KeyError: - pass - else: - v = varnames[i] - color = copy.deepcopy(input_color) - - for d in trace.get_values( - v, combine=combined, chains=chains, squeeze=False - ): - d = transform(d) - # iterate over columns in case varsize > 1 - - if v in dist_vars: - if source_idxs is None: - logger.info("No patches defined using 1 every 10!") - source_idxs = num.arange(0, d.shape[1], 10).tolist() - - logger.info( - "Plotting patches: %s" % utility.list2string(source_idxs) - ) + backup_source_idxs = copy.deepcopy(source_idxs) + + # subfigure handling + nrowtotal = int(num.ceil(n / 2.0)) + ncol = 2 + nrow_max = 4 + nplots_page_max = nrow_max * ncol + + n_subplots_total = nrowtotal * ncol - try: - selected = d.T[source_idxs] - except IndexError: - raise IndexError( - "One or several patches do not exist! " - "Patch idxs: %s" % utility.list2string(source_idxs) + ntotal_figs, nrest_subplots = utility.mod_i(n_subplots_total, nplots_page_max) + nsubplots_page = [nplots_page_max for _ in range(ntotal_figs)] + nsubplots_page.append(nrest_subplots) + + figs = [] + fig_axs = [] + for nsubplots in nsubplots_page: + + width, height = mpl_papersize("a4", "portrait") + height_subplot = height / nrow_max + nrow = int(num.ceil(nsubplots / ncol)) + + fig, axs = plt.subplots(nrow, ncol, figsize=(width, height_subplot * nrow)) + axs = num.atleast_2d(axs) + + for i in range(nsubplots): + + coli, rowi = utility.mod_i(i, nrow) + ax = axs[rowi, coli] + + if i > n - 1: + try: + fig.delaxes(ax) + except KeyError: + pass + else: + if nvar == 1: + source_idxs = [backup_source_idxs[i]] + + v = varnames[i] + + color = copy.deepcopy(input_color) + + for d in trace.get_values( + v, combine=combined, chains=chains, squeeze=False + ): + d = transform(d) + # iterate over columns in case varsize > 1 + + if v in dist_vars: + if source_idxs is None: + source_idx_step = int(num.floor(d.shape[1] / 6)) + logger.info("No patches defined using 1 every %i!") + source_idxs = num.arange( + 0, d.shape[1], source_idx_step + ).tolist() + + logger.info( + "Plotting patches: %s" % utility.list2string(source_idxs) ) - else: - selected = d.T - - nsources = selected.shape[0] - logger.debug("Number of sources: %i" % nsources) - for isource, e in enumerate(selected): - e = pmp.utils.make_2d(e) - if make_bins_flag: - varbin = make_bins(e, nbins=nbins, qlist=qlist) - varbins.append(varbin) + + try: + selected = num.atleast_2d(d.T[source_idxs]) + except IndexError: + raise IndexError( + "One or several patches do not exist! " + "Patch idxs: %s" % utility.list2string(source_idxs) + ) else: - varbin = varbins[i] + selected = d.T + + nsources = selected.shape[0] + logger.debug("Number of sources: %i" % nsources) + for isource, e in enumerate(selected): + e = pmp.utils.make_2d(e) + if make_bins_flag: + varbin = make_bins(e, nbins=nbins, qlist=qlist) + varbins.append(varbin) + else: + varbin = varbins[i] - if lines: - if v in lines: - reference = lines[v] + if lines: + if v in lines: + reference = lines[v] + else: + reference = None else: reference = None - else: - reference = None - if color is None: - if nsources == 1: - pcolor = "black" + if color is None: + if nsources == 1: + pcolor = "black" + else: + pcolor = mpl_graph_color(isource) else: - pcolor = mpl_graph_color(isource) - else: - pcolor = color - - if plot_style == "kde": - pmp.kdeplot( - e, - shade=alpha, - ax=axs[rowi, coli], - color=color, - linewidth=1.0, - kwargs_shade={"color": pcolor}, - ) - axs[rowi, coli].relim() - axs[rowi, coli].autoscale(tight=False) - axs[rowi, coli].set_ylim(0) - xax = axs[rowi, coli].get_xaxis() - # axs[rowi, coli].set_ylim([0, e.max()]) - xticker = MaxNLocator(nbins=5) - xax.set_major_locator(xticker) - elif plot_style in ["pdf", "cdf"]: - - if plot_style == "cdf": - kwargs["cumulative"] = True - - histplot_op( - axs[rowi, coli], - e, - reference=reference, - bins=varbin, - alpha=alpha, - color=pcolor, - qlist=qlist, - kwargs=kwargs, - ) - else: - raise NotImplementedError( - 'Plot style "%s" not implemented' % plot_style - ) - - try: - param = prior_bounds[v] - - if v in dist_vars: - try: # variable bounds - lower = param.lower[source_idxs] - upper = param.upper[source_idxs] - except IndexError: - lower, upper = param.lower, param.upper - - title = "{} {}".format(v, plot_units[hypername(v)]) + pcolor = color + + if plot_style == "kde": + pmp.kdeplot( + e, + shade=alpha, + ax=ax, + color=color, + linewidth=1.0, + kwargs_shade={"color": pcolor}, + ) + ax.relim() + ax.autoscale(tight=False) + ax.set_ylim(0) + xax = ax.get_xaxis() + # axs[rowi, coli].set_ylim([0, e.max()]) + xticker = MaxNLocator(nbins=5) + xax.set_major_locator(xticker) + elif plot_style in ["pdf", "cdf"]: + + kwargs["label"] = source_idxs + if plot_style == "cdf": + kwargs["cumulative"] = True + else: + kwargs["cumulative"] = False + + histplot_op( + ax, + e, + reference=reference, + bins=varbin, + alpha=alpha, + color=pcolor, + qlist=qlist, + kwargs=kwargs, + ) else: - lower = num.array2string(param.lower, separator=",")[1:-1] - upper = num.array2string(param.upper, separator=",")[1:-1] - - title = "{} {} priors: ({}; {})".format( - v, plot_units[hypername(v)], lower, upper + raise NotImplementedError( + 'Plot style "%s" not implemented' % plot_style ) - except KeyError: - try: - title = "{} {}".format(v, float(lines[v])) - except KeyError: - title = "{} {}".format(v, plot_units[hypername(v)]) - axs[rowi, coli].set_xlabel(title, fontsize=fontsize) - axs[rowi, coli].grid(grid) - axs[rowi, coli].get_yaxis().set_visible(False) - format_axes(axs[rowi, coli]) - axs[rowi, coli].tick_params(axis="x", labelsize=fontsize) - # axs[rowi, coli].set_ylabel("Frequency") - - if lines: try: - axs[rowi, coli].axvline(x=lines[v], color="white", lw=1.0) - axs[rowi, coli].axvline( - x=lines[v], color="black", linestyle="dashed", lw=1.0 - ) + param = prior_bounds[v] + + if v in dist_vars: + try: # variable bounds + lower = param.lower[source_idxs] + upper = param.upper[source_idxs] + except IndexError: + lower, upper = param.lower, param.upper + + title = "{} {}".format(v, plot_units[hypername(v)]) + else: + lower = num.array2string(param.lower, separator=",")[ + 1:-1 + ] + upper = num.array2string(param.upper, separator=",")[ + 1:-1 + ] + + title = "{} {} \npriors: ({}; {})".format( + v, plot_units[hypername(v)], lower, upper + ) except KeyError: - pass - - if posterior != "None": - if posterior == "all": - for k, idx in posterior_idxs.items(): - axs[rowi, coli].axvline( - x=e[idx], color=colors[k], lw=1.0 + try: + title = "{} {}".format(v, float(lines[v])) + except KeyError: + title = "{} {}".format(v, plot_units[hypername(v)]) + + axs[rowi, coli].set_xlabel(title, fontsize=fontsize) + if nvar == 1: + axs[rowi, coli].set_title( + "Patch %s" % utility.list2string(source_idxs), + loc="left", + fontsize=fontsize, + ) + ax.grid(grid) + ax.get_yaxis().set_visible(False) + format_axes(axs[rowi, coli]) + ax.tick_params(axis="x", labelsize=fontsize) + # axs[rowi, coli].set_ylabel("Frequency") + + if lines: + try: + ax.axvline(x=lines[v], color="white", lw=1.0) + ax.axvline( + x=lines[v], + color="black", + linestyle="dashed", + lw=1.0, ) - else: - idx = posterior_idxs[posterior] - axs[rowi, coli].axvline(x=e[idx], color=pcolor, lw=1.0) + except KeyError: + pass - if unify: - unities = unify_tick_intervals( - axs, varnames, ntickmarks_max=ntickmarks_max, axis="x" - ) - apply_unified_axis(axs, varnames, unities, axis="x", scale_factor=scale_factor) + if posterior != "None": + if posterior == "all": + for k, idx in posterior_idxs.items(): + ax.axvline(x=e[idx], color=colors[k], lw=1.0) + else: + idx = posterior_idxs[posterior] + ax.axvline(x=e[idx], color=pcolor, lw=1.0) + + if unify: + unities = unify_tick_intervals( + axs, varnames, ntickmarks_max=ntickmarks_max, axis="x" + ) + apply_unified_axis( + axs, varnames, unities, axis="x", scale_factor=scale_factor + ) - if source_idxs: - axs[0, 0].legend(source_idxs) + fig.subplots_adjust(wspace=0.05, hspace=0.5) + fig.tight_layout() - fig.tight_layout() - return fig, axs, varbins + figs.append(fig) + fig_axs.append(axs) + + return figs, fig_axs, varbins def correlation_plot( @@ -781,6 +826,8 @@ def draw_posteriors(problem, plot_options): % utility.list2string(plot_style_choices) ) + logger.info('Plotting "%s"' % plot_style) + stage = Stage( homepath=problem.outfolder, backend=problem.config.sampler_config.backend ) @@ -808,13 +855,13 @@ def draw_posteriors(problem, plot_options): else: sidxs = "" - outpath = os.path.join( + outpath_tmp = os.path.join( problem.outfolder, po.figure_dir, - "stage_%i_%s_%s_%s.%s" % (s, sidxs, po.post_llk, plot_style, po.outformat), + "stage_%i_%s_%s_%s" % (s, sidxs, po.post_llk, plot_style), ) - if not os.path.exists(outpath) or po.force: + if not os.path.exists(outpath_tmp + ".%s" % po.outformat) or po.force: logger.info("plotting stage: %s" % stage.handler.stage_path(s)) stage.load_results( varnames=problem.varnames, @@ -829,7 +876,7 @@ def draw_posteriors(problem, plot_options): prior_bounds.update(**pc.hierarchicals) prior_bounds.update(**pc.priors) - fig, _, _ = traceplot( + figs, _, _ = traceplot( stage.mtrace, varnames=varnames, chains=None, @@ -842,19 +889,22 @@ def draw_posteriors(problem, plot_options): nbins=nbins, ) - if not po.outformat == "display": - logger.info("saving figure to %s" % outpath) - fig.savefig(outpath, format=po.outformat, dpi=po.dpi) + if po.outformat == "display": + plt.show() else: - figs.append(fig) + logger.info("saving figures to %s" % outpath_tmp) + if po.outformat == "pdf": + with PdfPages(outpath_tmp + ".pdf") as opdf: + for fig in figs: + opdf.savefig(fig) + else: + for i, fig in enumerate(figs): + outpath = "%s_%i.%s" % (outpath_tmp, i, po.outformat) + logger.info("saving figure to %s" % outpath) + fig.savefig(outpath, format=po.outformat, dpi=po.dpi) else: - logger.info( - "plot for stage %s exists. Use force=True for" " replotting!" % s - ) - - if po.outformat == "display": - plt.show() + logger.info("plot for stage %s exists. Use force=True for replotting!" % s) def draw_correlation_hist(problem, plot_options): From a8b34c0f1aa931aca876057a604be65e1129e403 Mon Sep 17 00:00:00 2001 From: hvasbath Date: Fri, 26 Aug 2022 13:36:54 +0200 Subject: [PATCH 3/6] update CHANGELOG, correctly pass color to kde plot --- CHANGELOG.md | 13 +++++++++++++ beat/plotting/marginals.py | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1dac5c01..5de4c9f5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,19 @@ All notable changes to BEAT will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## [1.2.1] TBD 2022 +Contributors: Hannes Vasyura-Bathke @hvasbath + +### Added +**FFI** +- add calculation of coupling to derived variables at *Fault* for the summarize method + +**plotting** +- *plot_projection* argument available for *stage_posteriors* plot: cdf, pdf, kde + +### Fixed +- stage_posterior plot supports multipage output, figsize fixed to fractions of A4 + ## [1.2.0] 21 August 2022 Contributors: Mahdi Hamidbeygi @mahdihamidbeygi, Hannes Vasyura-Bathke @hvasbath diff --git a/beat/plotting/marginals.py b/beat/plotting/marginals.py index b969bf9f..8c8bbbfa 100644 --- a/beat/plotting/marginals.py +++ b/beat/plotting/marginals.py @@ -369,7 +369,7 @@ def remove_var(varnames, varname): e, shade=alpha, ax=ax, - color=color, + color=pcolor, linewidth=1.0, kwargs_shade={"color": pcolor}, ) From b29614c707aad48c16dac50e264ff1f14e500ba3 Mon Sep 17 00:00:00 2001 From: hvasbath Date: Mon, 29 Aug 2022 13:06:22 +0200 Subject: [PATCH 4/6] ffi.fault: add get_derived_variables method to fault beat.summarize, config, backend: rework bookkeeping of derived variables --- beat/apps/beat.py | 37 ++++++++++++++--------------- beat/backend.py | 27 +++++++-------------- beat/config.py | 48 +++++++++++++++++++++++++++++++++++++- beat/ffi/fault.py | 29 +++++++++++++++++------ beat/models/geodetic.py | 2 +- beat/plotting/common.py | 6 ++--- beat/plotting/marginals.py | 13 ++++++----- beat/sources.py | 12 ++-------- 8 files changed, 106 insertions(+), 68 deletions(-) diff --git a/beat/apps/beat.py b/beat/apps/beat.py index cfc16f7b..3c4efe41 100644 --- a/beat/apps/beat.py +++ b/beat/apps/beat.py @@ -19,7 +19,7 @@ from collections import OrderedDict from optparse import OptionParser -from numpy import array, atleast_2d, floor, zeros +from numpy import array, atleast_2d, floor, zeros, cumsum from pyrocko import model, util from pyrocko.gf import LocalEngine from pyrocko.guts import Dict, dump, load @@ -1204,10 +1204,14 @@ def setup(parser): buffer_size=sc.buffer_size, progressbar=False, ) + pc = problem.config.problem_config + reference = pc.get_test_point() if options.calc_derived: - rtrace.add_derived_variables(pc.source_type, n_sources=pc.n_sources) + varnames, shapes = pc.get_derived_variables_shapes() + rtrace.add_derived_variables(varnames, shapes) + splitinds = cumsum([shape[0] for shape in shapes[:-1]]) rtrace.setup(draws=draws, chain=-1, overwrite=True) @@ -1225,6 +1229,7 @@ def setup(parser): store = composite.engine.get_store(target.store_id) else: source = composite.load_fault_geometry() + sources = [source] engine = LocalEngine( store_superdirs=[composite.config.gf_config.store_superdir] ) @@ -1233,6 +1238,7 @@ def setup(parser): for chain in tqdm(chains): for idx in idxs: point = stage.mtrace.point(idx=idx, chain=chain) + reference.update(point) # normalize MT source, TODO put into get_derived_params if isinstance(source, MTSourceWithMagnitude): composite.point2sources(point) @@ -1241,7 +1247,7 @@ def setup(parser): ldicts.append(source.scaled_m6_dict) jpoint = utility.join_points(ldicts) - point.update(jpoint) + reference.update(jpoint) del jpoint, ldicts derived = [] @@ -1250,12 +1256,13 @@ def setup(parser): composite.point2sources(point) if hasattr(source, "get_derived_parameters"): for source in sources: - derived.append( - source.get_derived_parameters( - store=store, target=target - ) + deri = source.get_derived_parameters( + point=reference, # need to pass correction params + store=store, + target=target, + event=problem.config.event, ) - nderived = source.nderived_parameters + derived.append(deri) # pyrocko Rectangular source, TODO use BEAT RS ... elif isinstance(source, RectangularSource): @@ -1265,21 +1272,11 @@ def setup(parser): source.get_magnitude(store=store, target=target) ) - nderived = 1 - - # FFI - else: - derived.append( - source.get_magnitude( - point=point, store=store, target=target - ) - ) - nderived = 1 - lpoint = problem.model.lijection.d2l(point) + if derived: lpoint.extend( - map(ravel, split(vstack(derived).T, nderived, axis=0)) + map(ravel, split(vstack(derived).T, splitinds, axis=0)) ) # TODO: in PT with large buffer sizes somehow memory leak diff --git a/beat/backend.py b/beat/backend.py index b752506d..74cee0d6 100644 --- a/beat/backend.py +++ b/beat/backend.py @@ -44,7 +44,7 @@ from pymc3.step_methods.arraystep import BlockedStep from pyrocko import util -from beat.config import dc_components, mt_components, sample_p_outname, transd_vars_dist +from beat.config import sample_p_outname, transd_vars_dist from beat.covariance import calc_sample_covariance from beat.utility import ( ListArrayOrdering, @@ -57,13 +57,6 @@ logger = logging.getLogger("backend") -derived_variables_mapping = { - "MTQTSource": mt_components + dc_components, - "MTSource": dc_components, - "RectangularSource": ["magnitude"], -} - - def thin_buffer(buffer, buffer_thinning, ensure_last=True): """ Reduce a list of objects by a given value. @@ -297,19 +290,15 @@ def __len__(self): else: return self._df.shape[0] + len(self.buffer) - def add_derived_variables(self, source_type, n_sources=1): - - try: - varnames = derived_variables_mapping[source_type] - logger.info( - "Adding derived variables %s to " "trace." % list2string(varnames) + def add_derived_variables(self, varnames, shapes): + nshapes = len(shapes) + nvars = len(varnames) + if nvars != nshapes: + raise ValueError( + "Inconsistent number of variables %i and shapes %i!" % (nvars, nshapes) ) - except KeyError: - logger.info("No derived variables for %s" % source_type) - varnames = [] - for varname in varnames: - shape = (n_sources,) + for varname, shape in zip(varnames, shapes): self.flat_names[varname] = ttab.create_flat_names(varname, shape) self.var_shapes[varname] = shape self.var_dtypes[varname] = "float64" diff --git a/beat/config.py b/beat/config.py index 7a4bb3d4..0425bedf 100644 --- a/beat/config.py +++ b/beat/config.py @@ -42,6 +42,8 @@ _domain_choices, ) from beat.sources import MTQTSource, MTSourceWithMagnitude, RectangularSource +from beat.utility import check_point_keys, list2string + guts_prefix = "beat" @@ -100,6 +102,7 @@ ] + block_vars static_dist_vars = ["uparr", "uperp", "utens"] +derived_dist_vars = ["coupling"] hypo_vars = ["nucleation_strike", "nucleation_dip", "time"] partial_kinematic_vars = ["durations", "velocities"] @@ -110,7 +113,7 @@ kinematic_dist_vars = static_dist_vars + partial_kinematic_vars + hypo_vars transd_vars_dist = partial_kinematic_vars + static_dist_vars + voronoi_locations -dist_vars = static_dist_vars + partial_kinematic_vars +dist_vars = static_dist_vars + partial_kinematic_vars + derived_dist_vars interseismic_catalog = {"geodetic": interseismic_vars} @@ -130,6 +133,14 @@ ] ) +derived_variables_mapping = { + "MTQTSource": mt_components + dc_components, + "MTSource": dc_components, + "RectangularSource": ["magnitude"], + "RectangularSourcePole": ["magnitude", "coupling"], +} + + hyper_name_laplacian = "h_laplacian" moffdiag = (-1.0, 1.0) @@ -1572,6 +1583,41 @@ def get_parameter_shape(self, param): return shape + def get_derived_variables_shapes(self): + + source_type = self.source_type + + tpoint = self.get_test_point() + has_pole, _ = check_point_keys(tpoint, phrase="*_pole_lat") + + if has_pole: + source_type += "Pole" + + try: + varnames = derived_variables_mapping[source_type] + shapes = [] + for varname in varnames: + if self.mode == geometry_mode_str: + shape = (self.n_sources,) + elif self.mode == ffi_mode_str: + if varname == "magnitude": + shape = (1,) + else: + shape = (self.mode_config.npatches,) + + shapes.append(shape) + + logger.info( + "Adding derived variables %s with shapes %s to " + "trace." % (list2string(varnames), list2string(shapes)) + ) + except KeyError: + logger.info("No derived variables for %s" % source_type) + varnames = [] + shapes = [] + + return varnames, shapes + class SamplerParameters(Object): diff --git a/beat/ffi/fault.py b/beat/ffi/fault.py index 0e5ca85f..fe092a51 100644 --- a/beat/ffi/fault.py +++ b/beat/ffi/fault.py @@ -134,13 +134,16 @@ def set_model_resolution(self, model_resolution): self._model_resolution = model_resolution def get_model_resolution(self): - if self._model_resolution is None: - logger.warning( - "Model resolution matrix has not been calculated! " - "Please run beat.ffi.optimize_discretization on this fault! " - "Returning None!" - ) - return self._model_resolution + if hasattr(self, "_model_resolution"): + if self._model_resolution is None: + logger.warning( + "Model resolution matrix has not been calculated! " + "Please run beat.ffi.optimize_discretization on this fault! " + "Returning None!" + ) + return self._model_resolution + else: + return None def get_subfault_key(self, index, datatype, component): @@ -937,6 +940,18 @@ def needs_optimization(self): def is_discretized(self): return True if self.npatches else False + def get_derived_parameters(self, point=None, store=None, target=None, event=None): + + has_pole, _ = check_point_keys(point, phrase="*_pole_lat") + if has_pole: + euler_slips = euler_pole2slips(point=point, fault=self, event=event) + coupling = backslip2coupling(point, euler_slips) + else: + coupling = [] + + magnitude = self.get_magnitude(point=point, store=store, target=target) + return num.hstack([magnitude, coupling]) + def write_fault_to_pscmp( filename, fault, point=None, force=False, export_patch_idxs=False diff --git a/beat/models/geodetic.py b/beat/models/geodetic.py index a1135245..58ed542d 100644 --- a/beat/models/geodetic.py +++ b/beat/models/geodetic.py @@ -838,7 +838,7 @@ def point2sources(self, point): with random variables from solution space """ tpoint = copy.deepcopy(point) - tpoint.update(self.fixed_rvs) + # tpoint.update(self.fixed_rvs) if vars are fixed GFS are not calculated if self.nevents == 1: events = [self.event] # single event diff --git a/beat/plotting/common.py b/beat/plotting/common.py index af0332fe..5d6f52f2 100644 --- a/beat/plotting/common.py +++ b/beat/plotting/common.py @@ -28,6 +28,7 @@ u_s = "$[s]$" u_rad = "$[rad]$" u_hyp = "" +u_percent = "[$\%$]" u_nanostrain = "nstrain" plot_units = { @@ -60,6 +61,7 @@ "nucleation_x": u_hyp, "nucleation_y": u_hyp, "time_shift": u_s, + "coupling": u_percent, "uperp": u_m, "uparr": u_m, "utens": u_m, @@ -308,7 +310,6 @@ def histplot_op( """ cumulative = kwargs.pop("cumulative", "False") - labels = kwargs.pop("label", None) if color is not None and cmap is not None: logger.debug("Using color for histogram edgecolor ...") @@ -356,8 +357,6 @@ def histplot_op( else: kwargs["density"] = True - label = labels[i] - n, outbins, patches = ax.hist( d, bins=bins, @@ -368,7 +367,6 @@ def histplot_op( color=color, edgecolor=color, cumulative=cumulative, - label=label, **kwargs ) diff --git a/beat/plotting/marginals.py b/beat/plotting/marginals.py index 8c8bbbfa..5c718dd5 100644 --- a/beat/plotting/marginals.py +++ b/beat/plotting/marginals.py @@ -249,14 +249,14 @@ def remove_var(varnames, varname): } n = nvar = len(varnames) - if n == 1 and len(source_idxs) > 1: - n = len(source_idxs) - logger.info("Plotting of patches in panels ...") - varnames = varnames * n - elif n == 1 and source_idxs is None: + if n == 1 and source_idxs is None: raise IOError( "If only single variable is selected source_idxs need to be specified!" ) + elif n == 1 and len(source_idxs) > 1: + n = len(source_idxs) + logger.info("Plotting of patches in panels ...") + varnames = varnames * n else: logger.info("Plotting variables in panels ...") @@ -279,7 +279,8 @@ def remove_var(varnames, varname): ntotal_figs, nrest_subplots = utility.mod_i(n_subplots_total, nplots_page_max) nsubplots_page = [nplots_page_max for _ in range(ntotal_figs)] - nsubplots_page.append(nrest_subplots) + if nrest_subplots: + nsubplots_page.append(nrest_subplots) figs = [] fig_axs = [] diff --git a/beat/sources.py b/beat/sources.py index 9f6c0e64..363ad3bc 100644 --- a/beat/sources.py +++ b/beat/sources.py @@ -584,7 +584,7 @@ def from_pyrocko_event(cls, ev, **kwargs): d.update(kwargs) return super(MTQTSource, cls).from_pyrocko_event(ev, **d) - def get_derived_parameters(self, store=None, target=None): + def get_derived_parameters(self, point=None, store=None, target=None, event=None): """ Returns array with mt components and dc component conversions """ @@ -592,10 +592,6 @@ def get_derived_parameters(self, store=None, target=None): mt = mtm.MomentTensor.from_values(scaled_m6) return num.hstack((scaled_m6, num.hstack(mt.both_strike_dip_rake()))) - @property - def nderived_parameters(self): - return self.get_derived_parameters().size - def __getstate__(self): state = self.__dict__.copy() state["R"] = None @@ -696,10 +692,6 @@ def from_pyrocko_event(cls, ev, **kwargs): d.update(kwargs) return super(MTSourceWithMagnitude, cls).from_pyrocko_event(ev, **d) - def get_derived_parameters(self, store=None, target=None): + def get_derived_parameters(self, point=None, store=None, target=None, event=None): mt = mtm.MomentTensor.from_values(self.scaled_m6) return num.hstack(mt.both_strike_dip_rake()) - - @property - def nderived_parameters(self): - return self.get_derived_parameters().size From f521a8937335b7ef5a4feaf6ce04af4250f139aa Mon Sep 17 00:00:00 2001 From: hvasbath Date: Tue, 13 Sep 2022 22:29:45 +0200 Subject: [PATCH 5/6] plotting.seismic: seismic_fits supports multi-event output in separat files --- CHANGELOG.md | 1 + beat/plotting/common.py | 2 +- beat/plotting/seismic.py | 435 ++++++++++++++++++++------------------- 3 files changed, 227 insertions(+), 211 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5de4c9f5..cbb29053 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ Contributors: Hannes Vasyura-Bathke @hvasbath ### Fixed - stage_posterior plot supports multipage output, figsize fixed to fractions of A4 +- multievent waveform_fits plot returns separate figures for each sub-event ## [1.2.0] 21 August 2022 diff --git a/beat/plotting/common.py b/beat/plotting/common.py index 5d6f52f2..281e5f10 100644 --- a/beat/plotting/common.py +++ b/beat/plotting/common.py @@ -309,7 +309,7 @@ def histplot_op( Modified from pymc3. Additional color argument. """ - cumulative = kwargs.pop("cumulative", "False") + cumulative = kwargs.pop("cumulative", False) if color is not None and cmap is not None: logger.debug("Using color for histogram edgecolor ...") diff --git a/beat/plotting/seismic.py b/beat/plotting/seismic.py index 213ba4c8..5ce536d7 100644 --- a/beat/plotting/seismic.py +++ b/beat/plotting/seismic.py @@ -830,241 +830,252 @@ def seismic_fits(problem, stage, plot_options): else: all_time_shifts = {target: None for target in composite.targets} - # gather domain targets - domain_to_targets = utility.gather(composite.targets, lambda t: t.domain) + event_figs = [] + for event_idx, event in enumerate(composite.events): + # gather event related targets + event_targets = [] + for wmap in composite.wavemaps: + if event_idx == wmap.config.event_idx: + event_targets.extend(wmap.targets) - target_codes_to_targets = utility.gather(composite.targets, lambda t: t.codes) + target_codes_to_targets = utility.gather(event_targets, lambda t: t.codes) - # gather unique target codes - unique_target_codes = list(target_codes_to_targets.keys()) - cg_to_target_codes = utility.gather(unique_target_codes, lambda t: t[3]) + # gather unique target codes + unique_target_codes = list(target_codes_to_targets.keys()) + cg_to_target_codes = utility.gather(unique_target_codes, lambda t: t[3]) - skey = lambda tr: tr.channel - cgs = cg_to_target_codes.keys() + skey = lambda tr: tr.channel + cgs = cg_to_target_codes.keys() - figs = [] - logger.info("Plotting waveforms ...") - for cg in cgs: - target_codes = cg_to_target_codes[cg] + figs = [] + logger.info("Plotting waveforms ... for event number: %i" % event_idx) + logger.info(event.__str__()) + for cg in cgs: + target_codes = cg_to_target_codes[cg] - nframes = len(target_codes) + nframes = len(target_codes) - nx = int(num.ceil(num.sqrt(nframes))) - ny = (nframes - 1) // nx + 1 + nx = int(num.ceil(num.sqrt(nframes))) + ny = (nframes - 1) // nx + 1 - logger.debug("nx %i, ny %i" % (nx, ny)) + logger.debug("nx %i, ny %i" % (nx, ny)) - nxmax = 4 - nymax = 4 + nxmax = 4 + nymax = 4 - nxx = (nx - 1) // nxmax + 1 - nyy = (ny - 1) // nymax + 1 + nxx = (nx - 1) // nxmax + 1 + nyy = (ny - 1) // nymax + 1 - xs = num.arange(nx) // ((max(2, nx) - 1.0) / 2.0) - ys = num.arange(ny) // ((max(2, ny) - 1.0) / 2.0) + xs = num.arange(nx) // ((max(2, nx) - 1.0) / 2.0) + ys = num.arange(ny) // ((max(2, ny) - 1.0) / 2.0) - xs -= num.mean(xs) - ys -= num.mean(ys) + xs -= num.mean(xs) + ys -= num.mean(ys) - fxs = num.tile(xs, ny) - fys = num.repeat(ys, nx) + fxs = num.tile(xs, ny) + fys = num.repeat(ys, nx) - data = [] - for target_code in target_codes: - target = target_codes_to_targets[target_code][0] - azi = source.azibazi_to(target)[0] - dist = source.distance_to(target) - x = dist * num.sin(num.deg2rad(azi)) - y = dist * num.cos(num.deg2rad(azi)) - data.append((x, y, dist)) + data = [] + for target_code in target_codes: + targets = target_codes_to_targets[target_code] + target = targets[0] + azi = source.azibazi_to(target)[0] + dist = source.distance_to(target) + x = dist * num.sin(num.deg2rad(azi)) + y = dist * num.cos(num.deg2rad(azi)) + data.append((x, y, dist)) - gxs, gys, dists = num.array(data, dtype=num.float).T + gxs, gys, dists = num.array(data, dtype=num.float).T - iorder = num.argsort(dists) + iorder = num.argsort(dists) - gxs = gxs[iorder] - gys = gys[iorder] - target_codes_sorted = [target_codes[ii] for ii in iorder] + gxs = gxs[iorder] + gys = gys[iorder] + target_codes_sorted = [target_codes[ii] for ii in iorder] - gxs -= num.mean(gxs) - gys -= num.mean(gys) + gxs -= num.mean(gxs) + gys -= num.mean(gys) - gmax = max(num.max(num.abs(gys)), num.max(num.abs(gxs))) - if gmax == 0.0: - gmax = 1.0 + gmax = max(num.max(num.abs(gys)), num.max(num.abs(gxs))) + if gmax == 0.0: + gmax = 1.0 - gxs /= gmax - gys /= gmax + gxs /= gmax + gys /= gmax - dists = num.sqrt( - (fxs[num.newaxis, :] - gxs[:, num.newaxis]) ** 2 - + (fys[num.newaxis, :] - gys[:, num.newaxis]) ** 2 - ) + dists = num.sqrt( + (fxs[num.newaxis, :] - gxs[:, num.newaxis]) ** 2 + + (fys[num.newaxis, :] - gys[:, num.newaxis]) ** 2 + ) - distmax = num.max(dists) - - availmask = num.ones(dists.shape[1], dtype=num.bool) - frame_to_target_code = {} - for itarget, target_code in enumerate(target_codes_sorted): - iframe = num.argmin(num.where(availmask, dists[itarget], distmax + 1.0)) - availmask[iframe] = False - iy, ix = num.unravel_index(iframe, (ny, nx)) - frame_to_target_code[iy, ix] = target_code - - figures = {} - for iy in range(ny): - for ix in range(nx): - if (iy, ix) not in frame_to_target_code: - continue - - ixx = ix // nxmax - iyy = iy // nymax - if (iyy, ixx) not in figures: - figures[iyy, ixx] = plt.figure( - figsize=mpl_papersize("a4", "landscape") - ) + distmax = num.max(dists) + + availmask = num.ones(dists.shape[1], dtype=num.bool) + frame_to_target_code = {} + for itarget, target_code in enumerate(target_codes_sorted): + iframe = num.argmin(num.where(availmask, dists[itarget], distmax + 1.0)) + availmask[iframe] = False + iy, ix = num.unravel_index(iframe, (ny, nx)) + frame_to_target_code[iy, ix] = target_code + + figures = {} + for iy in range(ny): + for ix in range(nx): + if (iy, ix) not in frame_to_target_code: + continue + + ixx = ix // nxmax + iyy = iy // nymax + if (iyy, ixx) not in figures: + figures[iyy, ixx] = plt.figure( + figsize=mpl_papersize("a4", "landscape") + ) - figures[iyy, ixx].subplots_adjust( - left=0.03, - right=1.0 - 0.03, - bottom=0.03, - top=1.0 - 0.06, - wspace=0.20, - hspace=0.30, - ) + figures[iyy, ixx].subplots_adjust( + left=0.03, + right=1.0 - 0.03, + bottom=0.03, + top=1.0 - 0.06, + wspace=0.20, + hspace=0.30, + ) - figs.append(figures[iyy, ixx]) + figs.append(figures[iyy, ixx]) - logger.debug("iyy %i, ixx %i" % (iyy, ixx)) - logger.debug("iy %i, ix %i" % (iy, ix)) - fig = figures[iyy, ixx] + logger.debug("iyy %i, ixx %i" % (iyy, ixx)) + logger.debug("iy %i, ix %i" % (iy, ix)) + fig = figures[iyy, ixx] - target_code = frame_to_target_code[iy, ix] - domain_targets = target_codes_to_targets[target_code] - if len(domain_targets) > 1: - only_spectrum = False - else: - only_spectrum = True - - for k_subf, target in enumerate(domain_targets): - - syn_traces = all_syn_trs_target[target] - itarget = target_index[target] - result = bresults[itarget] - - # get min max of all traces - key = target.codes[3] - amin, amax = trace.minmax(syn_traces, key=skey)[key] - # need target specific minmax - absmax = max(abs(amin), abs(amax)) - - ny_this = nymax # min(ny, nymax) - nx_this = nxmax # min(nx, nxmax) - i_this = (iy % ny_this) * nx_this + (ix % nx_this) + 1 - logger.debug("i_this %i" % i_this) - logger.debug("Station {}".format(utility.list2string(target.codes))) - - if k_subf == 0: - # only create axes instances for first target - axes2 = fig.add_subplot(ny_this, nx_this, i_this) - - space = 0.4 - space_factor = 0.7 + space - axes2.set_axis_off() - axes2.set_ylim(-1.05 * space_factor, 1.05) - - axes = axes2.twinx() - axes.set_axis_off() - - if target.domain == "time": - ymin, ymax = -absmax * 1.5 * space_factor, absmax * 1.5 - try: - axes.set_ylim(ymin, ymax) - except ValueError: - logger.debug( - "These traces contain NaN or Inf open in snuffler?" - ) - input("Press enter! Otherwise Ctrl + C") - from pyrocko.trace import snuffle - - snuffle(syn_traces) - - subplot_waveforms( - axes=axes, - axes2=axes2, - po=po, - result=result, - target=target, - traces=syn_traces, - source=source, - var_reductions=all_var_reductions[target], - time_shifts=all_time_shifts[target], - time_shift_bounds=time_shift_bounds, - synth_plot_flag=synth_plot_flag, - absmax=absmax, - mode=composite._mode, - fontsize=fontsize, - syn_color=syn_color, - obs_color=obs_color, - time_shift_color=time_shift_color, - tap_color_edge=tap_color_edge, - tap_color_annot=tap_color_annot, + target_code = frame_to_target_code[iy, ix] + domain_targets = target_codes_to_targets[target_code] + if len(domain_targets) > 1: + only_spectrum = False + else: + only_spectrum = True + + for k_subf, target in enumerate(domain_targets): + + syn_traces = all_syn_trs_target[target] + itarget = target_index[target] + result = bresults[itarget] + + # get min max of all traces + key = target.codes[3] + amin, amax = trace.minmax(syn_traces, key=skey)[key] + # need target specific minmax + absmax = max(abs(amin), abs(amax)) + + ny_this = nymax # min(ny, nymax) + nx_this = nxmax # min(nx, nxmax) + i_this = (iy % ny_this) * nx_this + (ix % nx_this) + 1 + logger.debug("i_this %i" % i_this) + logger.debug( + "Station {}".format(utility.list2string(target.codes)) ) - if target.domain == "spectrum": - subplot_spectrum( - axes=axes, - axes2=axes2, - po=po, - target=target, - traces=syn_traces, - result=result, - synth_plot_flag=synth_plot_flag, - only_spectrum=only_spectrum, - var_reductions=all_var_reductions[target], - fontsize=fontsize, - syn_color=syn_color, - obs_color=obs_color, - misfit_color=misfit_color, - tap_color_annot=tap_color_annot, - ypad_factor=1.2, - ) + if k_subf == 0: + # only create axes instances for first target + axes2 = fig.add_subplot(ny_this, nx_this, i_this) + + space = 0.4 + space_factor = 0.7 + space + axes2.set_axis_off() + axes2.set_ylim(-1.05 * space_factor, 1.05) + + axes = axes2.twinx() + axes.set_axis_off() + + if target.domain == "time": + ymin, ymax = -absmax * 1.5 * space_factor, absmax * 1.5 + try: + axes.set_ylim(ymin, ymax) + except ValueError: + logger.debug( + "These traces contain NaN or Inf open in snuffler?" + ) + input("Press enter! Otherwise Ctrl + C") + from pyrocko.trace import snuffle + + snuffle(syn_traces) + + subplot_waveforms( + axes=axes, + axes2=axes2, + po=po, + result=result, + target=target, + traces=syn_traces, + source=source, + var_reductions=all_var_reductions[target], + time_shifts=all_time_shifts[target], + time_shift_bounds=time_shift_bounds, + synth_plot_flag=synth_plot_flag, + absmax=absmax, + mode=composite._mode, + fontsize=fontsize, + syn_color=syn_color, + obs_color=obs_color, + time_shift_color=time_shift_color, + tap_color_edge=tap_color_edge, + tap_color_annot=tap_color_annot, + ) - scale_string = None + if target.domain == "spectrum": + subplot_spectrum( + axes=axes, + axes2=axes2, + po=po, + target=target, + traces=syn_traces, + result=result, + synth_plot_flag=synth_plot_flag, + only_spectrum=only_spectrum, + var_reductions=all_var_reductions[target], + fontsize=fontsize, + syn_color=syn_color, + obs_color=obs_color, + misfit_color=misfit_color, + tap_color_annot=tap_color_annot, + ypad_factor=1.2, + ) - infos = [] - if scale_string: - infos.append(scale_string) + scale_string = None + + infos = [] + if scale_string: + infos.append(scale_string) + + infos.append(".".join(x for x in target.codes if x)) + dist = source.distance_to(target) + azi = source.azibazi_to(target)[0] + infos.append(str_dist(dist)) + infos.append("%.0f\u00B0" % azi) + # infos.append('%.3f' % gcms[itarget]) + axes2.annotate( + "\n".join(infos), + xy=(0.0, 1.0), + xycoords="axes fraction", + xytext=(1.0, 1.0), + textcoords="offset points", + ha="left", + va="top", + fontsize=fontsize, + fontstyle="normal", + zorder=10, + ) - infos.append(".".join(x for x in target.codes if x)) - dist = source.distance_to(target) - azi = source.azibazi_to(target)[0] - infos.append(str_dist(dist)) - infos.append("%.0f\u00B0" % azi) - # infos.append('%.3f' % gcms[itarget]) - axes2.annotate( - "\n".join(infos), - xy=(0.0, 1.0), - xycoords="axes fraction", - xytext=(1.0, 1.0), - textcoords="offset points", - ha="left", - va="top", - fontsize=fontsize, - fontstyle="normal", - zorder=10, - ) + axes2.set_zorder(10) - axes2.set_zorder(10) + for (iyy, ixx), fig in figures.items(): + title = ".".join(x for x in cg if x) + if len(figures) > 1: + title += " (%i/%i, %i/%i)" % (iyy + 1, nyy, ixx + 1, nxx) - for (iyy, ixx), fig in figures.items(): - title = ".".join(x for x in cg if x) - if len(figures) > 1: - title += " (%i/%i, %i/%i)" % (iyy + 1, nyy, ixx + 1, nxx) + fig.suptitle(title, fontsize=fontsize_title) - fig.suptitle(title, fontsize=fontsize_title) + event_figs.append((event_idx, figs)) - return figs + return event_figs def draw_seismic_fits(problem, po): @@ -1100,7 +1111,7 @@ def draw_seismic_fits(problem, po): ) if not os.path.exists(outpath) or po.force: - figs = seismic_fits(problem, stage, po) + event_figs = seismic_fits(problem, stage, po) else: logger.info("waveform plots exist. Use force=True for replotting!") return @@ -1108,14 +1119,18 @@ def draw_seismic_fits(problem, po): if po.outformat == "display": plt.show() else: - logger.info("saving figures to %s" % outpath) - if po.outformat == "pdf": - with PdfPages(outpath + ".pdf") as opdf: - for fig in figs: - opdf.savefig(fig) - else: - for i, fig in enumerate(figs): - fig.savefig(outpath + "_%i.%s" % (i, po.outformat), dpi=po.dpi) + for event_idx, figs in event_figs: + event_outpath = "{}_{}".format(outpath, event_idx) + logger.info("saving figures to %s" % event_outpath) + if po.outformat == "pdf": + with PdfPages(event_outpath + ".pdf") as opdf: + for fig in figs: + opdf.savefig(fig) + else: + for i, fig in enumerate(figs): + fig.savefig( + event_outpath + "_%i.%s" % (i, po.outformat), dpi=po.dpi + ) def point2array(point, varnames, rpoint=None): From 56ba0e93a164d99fc64056ac18c6bf339b03094b Mon Sep 17 00:00:00 2001 From: hvasbath Date: Wed, 14 Sep 2022 17:08:52 +0200 Subject: [PATCH 6/6] docs: update example 8 for --plot_projection functionality, version bump --- CHANGELOG.md | 1 + .../pol_stage_posteriors_variations.png | Bin 0 -> 119068 bytes docs/examples/MTQT_polarity.rst | 7 +++++++ pyproject.toml | 2 +- setup.py | 2 +- 5 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 docs/_static/example8/pol_stage_posteriors_variations.png diff --git a/CHANGELOG.md b/CHANGELOG.md index cbb29053..03a1d366 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ Contributors: Hannes Vasyura-Bathke @hvasbath **plotting** - *plot_projection* argument available for *stage_posteriors* plot: cdf, pdf, kde +- update Example 8 to showcase the use of this functionality ### Fixed - stage_posterior plot supports multipage output, figsize fixed to fractions of A4 diff --git a/docs/_static/example8/pol_stage_posteriors_variations.png b/docs/_static/example8/pol_stage_posteriors_variations.png new file mode 100644 index 0000000000000000000000000000000000000000..fdafeec9053e873f4d5bc0b8e0bd97d6b072cbde GIT binary patch literal 119068 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 X4_9jLy