Source code for dmsky.plotting

#!/usr/bin/env python
"""
Module for plotting stuff in dmsky.
"""

import numpy as np
import matplotlib.pyplot as plt

from dmsky.utils.units import Units


[docs]def plot_density(name, targets, xlims=None, nstep=100): """Make a plot of the density as a function of distance from the target center. Parameters ---------- name : str Name for the plot targets : list List of targets to include in the plot xlims : tuple Range for the x-axis of the plot nteps : int Number of points to include in the plot Returns ------- fig : `matplotlib.Figure` ax : `matplotlib.Axes` leg : `matplotlib.Legend` """ fig = plt.figure(name) ax = fig.add_subplot(111) if xlims is None: xmin = Units.convert_to(targets[0].density.rmin, 'kpc') xmax = Units.convert_to(targets[0].density.rmax, 'kpc') else: xmin = xlims[0] xmax = xlims[1] if np.isinf(xmax): xmax = 10. * Units.convert_to(targets[0].density.rs, 'kpc') fig = plt.figure(name) ax = fig.add_subplot(111) ax.set_xlim((xmin, xmax)) ax.set_yscale('log') ax.set_xlabel('Distance [kpc]') ax.set_ylabel(r'Density [GeV / cm$^3$]') xvals = np.linspace(xmin, xmax, nstep) for target in targets: density = target.density yvals = Units.convert_to(density(Units.convert_from(xvals, 'kpc')), 'gev_cm3') ax.plot(xvals, yvals, color=target.color, label=target.name) leg = ax.legend(loc="upper right", fontsize=10, ncol=2) return fig, ax, leg
[docs]def plot_j_profile(name, targets, xlims=None, nstep=100, ylims=None): """Make a plot of the J-factor as a function of the angle from the target center. Parameters ---------- name : str Name for the plot targets : list List of targets to include in the plot xlims : tuple Range for the x-axis of the plot nteps : int Number of points to include in the plot ylims : tuple Range for the y-axis of the plot Returns ------- fig : `matplotlib.Figure` ax : `matplotlib.Axes` leg : `matplotlib.Legend` """ fig = plt.figure(name) ax = fig.add_subplot(111) if xlims is None: xmin = 0. xmax = targets[0].psi_max else: xmin = xlims[0] xmax = xlims[1] fig = plt.figure() ax = fig.add_subplot(111) ax.set_xlim((xmin, xmax)) if ylims is not None: ax.set_ylim((ylims[0], ylims[1])) ax.set_yscale('log') ax.set_xlabel('Angular Separation [deg]') ax.set_ylabel(r'$dJ/d\Omega$ [GeV$^2$ / cm$^5$ sr]') xvals = np.linspace(xmin, xmax, nstep)[1:] for target in targets: j_profile = target.j_profile yvals = Units.convert_to(j_profile(xvals, degrees=True), 'gev2_cm5') ax.plot(xvals, yvals, color=target.color, label=target.name) leg = ax.legend(loc="upper right", fontsize=10, ncol=2) return fig, ax, leg
[docs]def plot_j_integ(name, targets, xlims=None, nstep=100, ylims=None): """Make a plot of the integrated J-factor as a function of the angle from the target center. Parameters ---------- name : str Name for the plot targets : list List of targets to include in the plot xlims : tuple Range for the x-axis of the plot nteps : int Number of points to include in the plot ylims : tuple Range for the y-axis of the plot Returns ------- fig : `matplotlib.Figure` ax : `matplotlib.Axes` leg : `matplotlib.Legend` """ fig = plt.figure(name) ax = fig.add_subplot(111) if xlims is None: xmin = 0. xmax = targets[0].psi_max else: xmin = xlims[0] xmax = xlims[1] fig = plt.figure() ax = fig.add_subplot(111) ax.set_xlim((xmin, xmax)) if ylims is not None: ax.set_ylim((ylims[0], ylims[1])) ax.set_yscale('log') ax.set_xlabel('Angular Separation [deg]') ax.set_ylabel(r'$J$ [GeV$^2$ / cm$^5$]') xvals = np.linspace(xmin, xmax, nstep)[1:] for target in targets: j_profile = target.j_profile yvals = Units.convert_to(j_profile.angularIntegral(xvals), 'gev2_cm5') ax.plot(xvals, yvals, color=target.color, label=target.name) leg = ax.legend(loc="lower right", fontsize=10, ncol=2) return fig, ax, leg