m = chain.shape[0] weight = weight / weight.max() samples = None while samples is None or samples.shape[0] < n: if samples is None: samples = chain[np.random.rand(m) < weight, :] else: samples = np.concatenate((samples, chain[np.random.rand(m) < weight, :])) samples = samples[:n, :] if stds_dict is not None: samples = np.hstack((samples, stds_dict[extra["name"]])) # c.add_chain(chain, weights=weight, parameters=model.get_labels(), **extra) c.add_chain(samples, parameters=model.get_labels() + [r"$\sigma_\alpha$"], **extra) c.configure(shade=True, bins=30, legend_artists=True) c.configure_truth(zorder=-10) c.analysis.get_latex_table(filename=pfn + "_params.txt", parameters=[r"$\alpha$"]) c.plotter.plot_summary( filename=pfn + "_summary.png", extra_parameter_spacing=1.5, errorbar=True, truth={"$\\Omega_m$": 0.31, "$\\alpha$": 0.9982} ) extents = {r"$\alpha$": [0.975, 1.032], r"$\sigma_\alpha$": [0.01, 0.029]} fig = c.plotter.plot_summary( filename=[pfn + "_summary2.png", pfn + "_summary2.pdf"], extra_parameter_spacing=1.5, parameters=[r"$\alpha$", r"$\sigma_\alpha$"], errorbar=True, truth={"$\\Omega_m$": 0.31, "$\\alpha$": 0.9982}, extents=extents, ) # c.plotter.plot(filename=pfn + "_contour.png", truth={"$\\Omega_m$": 0.31, '$\\alpha$': 1.0}) # c.plotter.plot_walks(filename=pfn + "_walks.png", truth={"$\\Omega_m$": 0.3121, '$\\alpha$': 1.0})
""" ############################################################################### # You can specify truth values using a list (in the same order as the # declared parameters). import numpy as np from numpy.random import normal, multivariate_normal from chainconsumer import ChainConsumer np.random.seed(2) cov = 0.2 * normal(size=(3, 3)) + np.identity(3) truth = normal(size=3) data = multivariate_normal(truth, 0.5 * (cov + cov.T), size=100000) c = ChainConsumer().add_chain(data, parameters=["$x$", "$y$", r"$\beta$"]) fig = c.plotter.plot(truth=truth) fig.set_size_inches( 4.5 + fig.get_size_inches()) # Resize fig for doco. You don't need this. ############################################################################### # Or you can specify truth values using a dictionary. This allows you to specify # truth values for only some parameters. You can also customise the look # of your truth lines. c.configure_truth(color='w', ls=":", alpha=0.8) fig2 = c.plotter.plot(truth={"$x$": truth[0], "$y$": truth[1]}) fig2.set_size_inches( 4.5 + fig2.get_size_inches()) # Resize fig for doco. You don't need this.
# c.add_chain(samples_chain35,parameters=[r"$\mathbf{log_{10}\ M_{1}}$", # r"$\mathbf{log_{10}\ M_{*}}$", r"$\boldsymbol{\beta}$", # r"$\boldsymbol{\delta}$", r"$\boldsymbol{\xi}$", # r"$\mathbf{log_{10}\ M^{qc}_{h}}$", r"$\mathbf{log_{10}\ M^{qs}_{h}}$", # r"$\boldsymbol{{\mu}_c}$", r"$\boldsymbol{{\mu}_s}$"], # name=r"ECO halo: $\mathbf{\Phi}$ + $\mathbf{f_{blue, cen}}$ + $\mathbf{f_{blue, sat}}$", color='#E766EA', # zorder=10) # c.configure(shade_gradient=[0.1, 3.0], colors=['r', 'b'], \ # sigmas=[1,2], shade_alpha=0.4) # sigma levels for 1D gaussian showing 68%,95% conf intervals c.configure(kde=2.0, shade_gradient = 2.0, shade_alpha=0.8, label_font_size=15, tick_font_size=10, summary=False, sigma2d=False, diagonal_tick_labels=False, max_ticks=4, linewidths=2, legend_kwargs={"fontsize": 15}) c.configure_truth(color='goldenrod', lw=1.7) fig1 = c.plotter.plot(display=True) # c.configure(label_font_size=15, tick_font_size=10, summary=True, # sigma2d=False, legend_kwargs={"fontsize": 15}) if quenching == 'hybrid': fig1 = c.plotter.plot(display=True, truth=best_fit_hybrid) elif quenching == 'halo': fig1 = c.plotter.plot(display=True, truth=best_fit_halo) if quenching == 'hybrid': fig1 = c.plotter.plot(filename='/Users/asadm2/Documents/Grad_School/Research/Papers/RESOLVE_Statistics_paper/Figures/contours_{0}.pdf'.format(quenching), truth=best_fit_hybrid) elif quenching == 'halo': fig1 = c.plotter.plot(filename='/Users/asadm2/Documents/Grad_School/Research/Papers/RESOLVE_Statistics_paper/Figures/contours_{0}.pdf'.format(quenching), truth=best_fit_halo)
Plot truth values on top of your contours. """ ############################################################################### # You can specify truth values using a list (in the same order as the # declared parameters). import numpy as np from numpy.random import normal, multivariate_normal from chainconsumer import ChainConsumer np.random.seed(2) cov = 0.2 * normal(size=(3, 3)) + np.identity(3) truth = normal(size=3) data = multivariate_normal(truth, np.dot(cov, cov.T), size=100000) c = ChainConsumer().add_chain(data, parameters=["$x$", "$y$", r"$\beta$"]) fig = c.plotter.plot(truth=truth) fig.set_size_inches(4.5 + fig.get_size_inches()) # Resize fig for doco. You don't need this. ############################################################################### # Or you can specify truth values using a dictionary. This allows you to specify # truth values for only some parameters. You can also customise the look # of your truth lines. c.configure_truth(color='w', ls=":", alpha=0.8) fig2 = c.plotter.plot(truth={"$x$": truth[0], "$y$": truth[1]}) fig2.set_size_inches(4.5 + fig2.get_size_inches()) # Resize fig for doco. You don't need this.
def plotmaker(params, parameters, inj): ''' Make posterior plots from the samples generated by tge mcmc/nested sampling algorithm. Parameters ----------- params : dictionary Dictionary of config params parameters: string Array or list of strings with names of the parameters npar : int Dimensionality of the parameter space ''' post = np.loadtxt(params['out_dir'] + "/post_samples.txt") ## if modeltype is sph, first call the mapmaker. if params['modeltype'] == 'sph_sgwb': mapmaker(params, post) ## setup the truevals dict truevals = [] if params['modeltype'] == 'isgwb': truevals.append(inj['log_Np']) truevals.append(inj['log_Na']) truevals.append(inj['alpha']) truevals.append(inj['ln_omega0']) elif params['modeltype'] == 'noise_only': truevals.append(inj['log_Np']) truevals.append(inj['log_Na']) elif params['modeltype'] == 'isgwb_only': truevals.append(inj['alpha']) truevals.append(inj['ln_omega0']) elif params['modeltype'] == 'sph_sgwb': truevals.append(inj['log_Np']) truevals.append(inj['log_Na']) truevals.append(inj['alpha']) truevals.append(inj['ln_omega0']) ## get blms for lval in range(1, params['lmax'] + 1): for mval in range(lval + 1): idx = Alm.getidx(params['lmax'], lval, mval) if mval == 0: truevals.append(np.real(inj['blms'][idx])) else: truevals.append(np.abs(inj['blms'][idx])) truevals.append(np.angle(inj['blms'][idx])) if len(truevals) > 0: knowTrue = 1 ## Bit for whether we know the true vals or not else: knowTrue = 0 npar = len(parameters) plotrange = [0.999] * npar if params['out_dir'][-1] != '/': params['out_dir'] = params['out_dir'] + '/' ## Make chainconsumer corner plots cc = ChainConsumer() cc.add_chain(post, parameters=parameters) cc.configure(smooth=False, kde=False, max_ticks=2, sigmas=np.array([1, 2]), label_font_size=18, tick_font_size=18, \ summary=False, statistics="max_central", spacing=2, summary_area=0.95, cloud=False, bins=1.2) cc.configure_truth(color='g', ls='--', alpha=0.7) if knowTrue: fig = cc.plotter.plot(figsize=(16, 16), truth=truevals) else: fig = cc.plotter.plot(figsize=(16, 16)) ## make axis labels to be parameter summaries sum_data = cc.analysis.get_summary() axes = np.array(fig.axes).reshape((npar, npar)) # Adjust axis labels for ii in range(npar): ax = axes[ii, ii] # get the right summary for the parameter ii sum_ax = sum_data[parameters[ii]] err = [sum_ax[2] - sum_ax[1], sum_ax[1] - sum_ax[0]] if np.abs(sum_ax[1]) <= 1e-3: mean_def = '{0:.3e}'.format(sum_ax[1]) eidx = mean_def.find('e') base = float(mean_def[0:eidx]) exponent = int(mean_def[eidx + 1:]) mean_form = str(base) + ' \\times ' + '10^{' + str(exponent) + '} ' else: mean_form = '{0:.3f}'.format(sum_ax[1]) if np.abs(err[0]) <= 1e-2: err[0] = '{0:.4f}'.format(err[0]) else: err[0] = '{0:.2f}'.format(err[0]) if np.abs(err[1]) <= 1e-2: err[1] = '{0:.4f}'.format(err[1]) else: err[1] = '{0:.2f}'.format(err[1]) label = parameters[ii][:-1] + ' = ' + mean_form + '^{+' + err[ 0] + '}_{-' + err[1] + '}$' ax.set_title(label, {'fontsize': 18}, loc='left') ## Save posterior plt.savefig(params['out_dir'] + 'corners.png', dpi=150) print("Posteriors plots printed in " + params['out_dir'] + "corners.png") plt.close()