Source code for gammapy.time.plot

# Licensed under a 3-clause BSD style license - see LICENSE.rst
from __future__ import absolute_import, division, print_function, unicode_literals
import numpy as np
from astropy.time import Time, TimeDelta
from ..utils.time import TIME_REF_FERMI

__all__ = [
    'plot_fermi_3fgl_light_curve',
]


def plot_time_difference_distribution(time, ax=None):
    """Plot event time difference distribution.

    Parameters
    ----------
    time : `~astropy.time.Time`
        Event times (must be sorted)
    ax : `~matplotlib.axes.Axes` or None
        Axes
    Returns
    -------
    ax : `~matplotlib.axes.Axes`
        Axes
    """
    import matplotlib.pyplot as plt

    if ax is None:
        ax = plt.gcf()

    td = time[1:] - time[:-1]

    # TODO: implement!
    raise NotImplementedError


[docs]def plot_fermi_3fgl_light_curve(source_name, time_start=None, time_end=None, ax=None): """Plot flux as a function of time for a fermi 3FGL object. Parameters ---------- source_name : str The 3FGL catalog name of the object to plot time_start : `~astropy.time.Time` or str or None Light curve start time. If None, use the earliest time in the catalog. time_end : `~astropy.time.Time` or str or None Light curve end time. If None, use the latest time in the catalog. ax : `~matplotlib.axes.Axes` or None Axes Returns ------- ax : `~matplotlib.axes.Axes` Axes Examples -------- Plot a 3FGL lightcurve: .. plot:: :include-source: from gammapy.time import plot_fermi_3fgl_light_curve plot_fermi_3fgl_light_curve('3FGL J0349.9-2102', time_start='2010-01-01', time_end='2015-02-02') import matplotlib.pyplot as plt plt.show() """ from ..catalog import fetch_fermi_catalog import matplotlib.pyplot as plt import matplotlib.dates as mdates ax = plt.gca() if ax is None else ax if time_start is None: time_start = Time('2008-08-02T00:33:19') else: time_start = Time(time_start) if time_end is None: time_end = Time('2012-07-31T22:45:47') else: time_end = Time(time_end) fermi_met_start = (time_start - TIME_REF_FERMI).sec fermi_met_end = (time_end - TIME_REF_FERMI).sec fermi_cat = fetch_fermi_catalog('3FGL') catalog_index = np.where(fermi_cat[1].data['Source_Name'] == source_name)[0][0] hist_start = fermi_cat[3].data['Hist_Start'] time_index_start = np.where(hist_start >= fermi_met_start)[0][0] # The final entry is the end of the last bin, so no off by one error time_index_end = np.where(hist_start <= fermi_met_end)[0][-1] + 1 time_start = hist_start[time_index_start: time_index_end] time_end = np.roll(time_start, -1) time_diff = 0.5 * (time_end - time_start) # Trim because there is one more bin edge than there is bin mid point time_diff = time_diff[0:-1] # Midpoints of each bin. time_mid = time_start[0:-1] + time_diff cat_row = fermi_cat[1].data[catalog_index] flux_history = cat_row['Flux_History'][time_index_start: time_index_end] flux_history_lower_bound = cat_row['Unc_Flux_History'][time_index_start: time_index_end, 0] flux_history_upper_bound = cat_row['Unc_Flux_History'][time_index_start: time_index_end, 1] flux_history_lower_bound = abs(flux_history_lower_bound) time_mid = (TIME_REF_FERMI + TimeDelta(time_mid, format='sec')) time_at_bin_start = time_mid - TimeDelta(time_diff, format='sec') time_at_bin_end = time_mid + TimeDelta(time_diff, format='sec') time_mid = time_mid.plot_date time_at_bin_start = time_at_bin_start.plot_date time_at_bin_end = time_at_bin_end.plot_date time_diff_at_bin_start = time_mid - time_at_bin_start time_diff_at_bin_end = time_at_bin_end - time_mid # Where a lower bound was recorded. idx1 = np.where(np.invert(np.isnan(flux_history_lower_bound))) # Where a lower bound was not recorded. idx2 = np.where(np.isnan(flux_history_lower_bound)) # Where no lower bound was recorded, set to zero flux. flux_history_lower_bound[idx2] = flux_history[idx2] # Plot data points and upper limits. ax.errorbar(time_mid[idx1], flux_history[idx1], yerr=(flux_history_lower_bound[idx1], flux_history_upper_bound[idx1]), xerr=(time_diff_at_bin_start[idx1], time_diff_at_bin_end[idx1]), marker='o', elinewidth=1, linewidth=0, color='black') ax.errorbar(time_mid[idx2], flux_history[idx2], yerr=(flux_history_lower_bound[idx2], flux_history_upper_bound[idx2]), marker=None, elinewidth=1, linewidth=0, color='black') ax.scatter(time_mid[idx2], (flux_history[idx2] + flux_history_upper_bound[idx2]), marker='v', color='black') ax.set_xlabel('Date') ax.set_ylabel('Flux (ph/cm^2/s)') ax.set_ylim(ymin=0) ax.xaxis_date() ax.xaxis.set_major_formatter(mdates.DateFormatter('%m/%Y')) ax.xaxis.set_major_locator(mdates.MonthLocator(interval=6)) ax.figure.autofmt_xdate() return ax