Source code for cosmoglobe.plot.histogram

from e13tools import raise_error
import numpy as np
import healpy as hp
import matplotlib.pyplot as plt
from .plottools import set_style, make_fig, get_percentile
from cosmoglobe.h5.chain import Chain
import scipy.stats as stats


[docs]def hist( input, *args, dataset=None, prior=None, xlabel=None, ylabel=None, field=0, darkmode=False, figsize=None, sub=None, hold=False, reuse_axes=False, **kwargs, ): """ This function is a wrapper on the existing matplotlib histogram with custom styling. Possible to plot accompanying normalized prior distribution Parameters ---------- input : array data input array prior : touple, optional mean and stddev of gaussian distribution overlay default: None dataset : str, optional dataset to plot if passing hdf5 file default: None xlabel : str, optional label x axis default: None ylabel : str, optional label y axis default: None field : int, optional which field to plot if .fits file is passed default: 0 darkmode : bool, optional turn all axis elements white for optimal dark visualization default: False figsize : touple, optional size of figure default: None sub : int, scalar or sequence, optional Use only a zone of the current figure (same syntax as subplot). Default: None hold : bool, optional If True, replace the current Axes by a MollweideAxes. use this if you want to have multiple maps on the same figure. Default: False reuse_axes : bool, optional If True, reuse the current Axes (should be a MollweideAxes). This is useful if you want to overplot with a partially transparent colormap, such as for plotting a line integral convolution. Default: False """ hp.mollview if isinstance(input, str): if input.endswith(".h5") and dataset is not None: chain = Chain(input) if ylabel == None: ylabel = dataset input = chain.get(dataset) elif input.endswith(".fits"): input = hp.read_map(input, field=field) else: raise_error("Input format not recognized") # Make figure fig, ax = make_fig( figsize, None, hold, sub, reuse_axes, darkmode, ) # Use matplotlib histogram function with specific options n, bins, patches = plt.hist(input, *args, histtype="step", density=True, stacked=True, **kwargs) # Overlay a gaussian prior if prior is not None: dx = bins[1] - bins[0] x = np.linspace(bins[0], bins[-1], len(input)) norm = sum(n) * dx Pprior = stats.norm.pdf(x, prior[0], prior[1]) # *norm plt.plot( x, Pprior * norm, linestyle=":", label=r"$\mathcal{N}(" + f"{prior[0]},{prior[1]}" + ")$", ) # Tick and spine parameters ax.spines["top"].set_visible(False) ax.spines["right"].set_visible(False) ax.tick_params(axis="both", which="both", direction="in") plt.yticks( rotation=90, va="center", ) ax.set_ylabel(ylabel) ax.set_xlabel(xlabel) return n, bins, patches