Sky Map Plotting (ligo.skymap.plot.allsky)

Axes subclasses for astronomical mapmaking.

This module adds several astropy.visualization.wcsaxes.WCSAxes subclasses to the Matplotlib projection registry. The projections have names of the form astro_or_geo_or_galactic [lon_units] projection.

astro_or_geo_or_galactic may be astro, geo, or galactic. It controls the reference frame, either celestial (ICRS), terrestrial (ITRS), or galactic.

lon_units may be hours or degrees. It controls the units of the longitude axis. If omitted, astro implies hours and geo implies degrees.

projection may be any of the following:

  • aitoff for the Aitoff all-sky projection

  • mollweide for the Mollweide all-sky projection

  • globe for an orthographic projection, like the three-dimensional view of the Earth from a distant satellite

  • zoom for a gnomonic projection suitable for visualizing small zoomed-in patches

Some of the projections support additional optional arguments. The globe projections support the options center and rotate. The zoom projections support the options center, radius, and rotate.

Examples

import ligo.skymap.plot
from matplotlib import pyplot as plt
ax = plt.axes(projection='astro hours mollweide')
ax.grid()

(Source code, png, hires.png, pdf)

../_images/allsky-1.png
import ligo.skymap.plot
from matplotlib import pyplot as plt
ax = plt.axes(projection='geo aitoff')
ax.grid()

(Source code, png, hires.png, pdf)

../_images/allsky-2.png
import ligo.skymap.plot
from matplotlib import pyplot as plt
ax = plt.axes(projection='astro zoom',
              center='5h -32d', radius='5 deg', rotate='20 deg')
ax.grid()

(Source code, png, hires.png, pdf)

../_images/allsky-3.png
import ligo.skymap.plot
from matplotlib import pyplot as plt
ax = plt.axes(projection='geo globe', center='-50d +23d')
ax.grid()

(Source code, png, hires.png, pdf)

../_images/allsky-4.png

Insets

You can use insets to link zoom-in views between axes. There are two supported styles of insets: rectangular and circular (loupe). The example below shows both kinds of insets.

import ligo.skymap.plot
from matplotlib import pyplot as plt
fig = plt.figure(figsize=(9, 4), dpi=100)

ax_globe = plt.axes(
    [0.1, 0.1, 0.8, 0.8],
    projection='astro degrees globe',
    center='120d +23d')

ax_zoom_rect = plt.axes(
    [0.0, 0.2, 0.4, 0.4],
    projection='astro degrees zoom',
    center='150d +30d',
    radius='9 deg')

ax_zoom_circle = plt.axes(
    [0.55, 0.1, 0.6, 0.6],
    projection='astro degrees zoom',
    center='120d +10d',
    radius='5 deg')

ax_globe.mark_inset_axes(ax_zoom_rect)
ax_globe.connect_inset_axes(ax_zoom_rect, 'upper left')
ax_globe.connect_inset_axes(ax_zoom_rect, 'lower right')

ax_globe.mark_inset_circle(ax_zoom_circle, '120d +10d', '4 deg')
ax_globe.connect_inset_circle(ax_zoom_circle, '120d +10d', '4 deg')

ax_globe.grid()
ax_zoom_rect.grid()
ax_zoom_circle.grid()

for ax in [ax_globe, ax_zoom_rect, ax_zoom_circle]:
    ax.set_facecolor('none')
    for key in ['ra', 'dec']:
        ax.coords[key].set_auto_axislabel(False)

(Source code, png, hires.png, pdf)

../_images/allsky-5.png

Complete Example

The following example demonstrates most of the features of this module.

from astropy.coordinates import SkyCoord
from astropy.io import fits
from astropy import units as u
import ligo.skymap.plot
from matplotlib import pyplot as plt

url = 'https://dcc.ligo.org/public/0146/G1701985/001/bayestar_no_virgo.fits.gz'
center = SkyCoord.from_name('NGC 4993')

fig = plt.figure(figsize=(4, 4), dpi=100)

ax = plt.axes(
    [0.05, 0.05, 0.9, 0.9],
    projection='astro globe',
    center=center)

ax_inset = plt.axes(
    [0.59, 0.3, 0.4, 0.4],
    projection='astro zoom',
    center=center,
    radius=10*u.deg)

for key in ['ra', 'dec']:
    ax_inset.coords[key].set_ticklabel_visible(False)
    ax_inset.coords[key].set_ticks_visible(False)
ax.grid()
ax.mark_inset_axes(ax_inset)
ax.connect_inset_axes(ax_inset, 'upper left')
ax.connect_inset_axes(ax_inset, 'lower left')
ax_inset.scalebar((0.1, 0.1), 5 * u.deg).label()
ax_inset.compass(0.9, 0.1, 0.2)

ax.imshow_hpx(url, cmap='cylon')
ax_inset.imshow_hpx(url, cmap='cylon')
ax_inset.plot(
    center.ra.deg, center.dec.deg,
    transform=ax_inset.get_transform('world'),
    marker=ligo.skymap.plot.reticle(),
    markersize=30,
    markeredgewidth=3)

(Source code, png, hires.png, pdf)

../_images/allsky-6.png
class ligo.skymap.plot.allsky.AutoScaledWCSAxes(*args, header, obstime=None, **kwargs)[source] [edit on github]

Bases: astropy.visualization.wcsaxes.WCSAxes

Axes base class. The pixel scale is adjusted to the DPI of the image, and there are a variety of convenience methods.

compass(x, y, size)[source] [edit on github]

Add a compass to indicate the north and east directions.

Parameters
x, yfloat

Position of compass vertex in axes coordinates.

sizefloat

Size of compass in axes coordinates.

connect_inset_axes(ax, loc, *args, **kwargs)[source] [edit on github]

Connect a corner of another WCSAxes to the matching point inside this one.

Parameters
axastropy.visualization.wcsaxes.WCSAxes

The other axes.

locint, str

Which corner to connect. For valid values, see matplotlib.offsetbox.AnchoredOffsetbox.

Returns
patchmatplotlib.patches.ConnectionPatch
Other Parameters
args

Extra arguments for matplotlib.patches.ConnectionPatch

kwargs

Extra keyword arguments for matplotlib.patches.ConnectionPatch

connect_inset_circle(ax, center, radius, *args, **kwargs)[source] [edit on github]

Connect a circle in this and another Axes to create a loupe.

Parameters
axastropy.visualization.wcsaxes.WCSAxes

The other axes.

coordastropy.coordinates.SkyCoord

The center of the circle.

radiusastropy.units.Quantity

The radius of the circle in units that are compatible with degrees.

Returns
patch1, patch2matplotlib.patches.ConnectionPatch

The two connecting patches.

Other Parameters
args

Extra arguments for matplotlib.patches.PathPatch

kwargs

Extra keyword arguments for matplotlib.patches.PathPatch

contour_hpx(data, hdu_in=None, order='bilinear', nested=False, field=0, smooth=None, **kwargs)[source] [edit on github]

Add contour levels for a HEALPix data set.

Parameters
datanumpy.ndarray or str or TableHDU or BinTableHDU or tuple

The HEALPix data set. If this is a numpy.ndarray, then it is interpreted as the HEALPix array in the same coordinate system as the axes. Otherwise, the input data can be any type that is understood by reproject.reproject_from_healpix.

smoothastropy.units.Quantity, optional

An optional smoothing length in angle-compatible units.

Returns
countoursmatplotlib.contour.QuadContourSet
Other Parameters
hdu_in, order, nested, field, smooth

Extra arguments for reproject.reproject_from_healpix

kwargs

Extra keyword arguments for matplotlib.axes.Axes.contour

contourf_hpx(data, hdu_in=None, order='bilinear', nested=False, field=0, smooth=None, **kwargs)[source] [edit on github]

Add filled contour levels for a HEALPix data set.

Parameters
datanumpy.ndarray or str or TableHDU or BinTableHDU or tuple

The HEALPix data set. If this is a numpy.ndarray, then it is interpreted as the HEALPix array in the same coordinate system as the axes. Otherwise, the input data can be any type that is understood by reproject.reproject_from_healpix.

smoothastropy.units.Quantity, optional

An optional smoothing length in angle-compatible units.

Returns
contoursmatplotlib.contour.QuadContourSet
Other Parameters
hdu_in, order, nested, field, smooth

Extra arguments for reproject.reproject_from_healpix

kwargs

Extra keyword arguments for matplotlib.axes.Axes.contour

imshow_hpx(data, hdu_in=None, order='bilinear', nested=False, field=0, smooth=None, **kwargs)[source] [edit on github]

Add an image for a HEALPix data set.

Parameters
datanumpy.ndarray or str or TableHDU or BinTableHDU or tuple

The HEALPix data set. If this is a numpy.ndarray, then it is interpreted as the HEALPix array in the same coordinate system as the axes. Otherwise, the input data can be any type that is understood by reproject.reproject_from_healpix.

smoothastropy.units.Quantity, optional

An optional smoothing length in angle-compatible units.

Returns
imagematplotlib.image.AxesImage
Other Parameters
hdu_in, order, nested, field, smooth

Extra arguments for reproject.reproject_from_healpix

kwargs

Extra keyword arguments for matplotlib.axes.Axes.contour

mark_inset_axes(ax, *args, **kwargs)[source] [edit on github]

Outline the footprint of another WCSAxes inside this one.

Parameters
axastropy.visualization.wcsaxes.WCSAxes

The other axes.

Returns
patchmatplotlib.patches.PathPatch
Other Parameters
args

Extra arguments for matplotlib.patches.PathPatch

kwargs

Extra keyword arguments for matplotlib.patches.PathPatch

mark_inset_circle(ax, center, radius, *args, **kwargs)[source] [edit on github]

Outline a circle in this and another Axes to create a loupe.

Parameters
axastropy.visualization.wcsaxes.WCSAxes

The other axes.

coordastropy.coordinates.SkyCoord

The center of the circle.

radiusastropy.units.Quantity

The radius of the circle in units that are compatible with degrees.

Returns
patch1matplotlib.patches.PathPatch

The outline of the circle in these Axes.

patch2matplotlib.patches.PathPatch

The outline of the circle in the other Axes.

Other Parameters
args

Extra arguments for matplotlib.patches.PathPatch

kwargs

Extra keyword arguments for matplotlib.patches.PathPatch

scalebar(*args, **kwargs)[source] [edit on github]

Add scale bar.

Parameters
xytuple

The axes coordinates of the scale bar.

lengthastropy.units.Quantity

The length of the scale bar in angle-compatible units.

Returns
patchmatplotlib.patches.FancyArrowPatch
Other Parameters
args

Extra arguments for matplotlib.patches.FancyArrowPatch

kwargs

Extra keyword arguments for matplotlib.patches.FancyArrowPatch

set(*, adjustable=<UNSET>, agg_filter=<UNSET>, alpha=<UNSET>, anchor=<UNSET>, animated=<UNSET>, aspect=<UNSET>, autoscale_on=<UNSET>, autoscalex_on=<UNSET>, autoscaley_on=<UNSET>, axes_locator=<UNSET>, axisbelow=<UNSET>, box_aspect=<UNSET>, clip_box=<UNSET>, clip_on=<UNSET>, clip_path=<UNSET>, facecolor=<UNSET>, frame_on=<UNSET>, gid=<UNSET>, in_layout=<UNSET>, label=<UNSET>, navigate=<UNSET>, path_effects=<UNSET>, picker=<UNSET>, position=<UNSET>, prop_cycle=<UNSET>, rasterization_zorder=<UNSET>, rasterized=<UNSET>, sketch_params=<UNSET>, snap=<UNSET>, title=<UNSET>, transform=<UNSET>, url=<UNSET>, visible=<UNSET>, xbound=<UNSET>, xlabel=<UNSET>, xlim=<UNSET>, xmargin=<UNSET>, xscale=<UNSET>, xticklabels=<UNSET>, xticks=<UNSET>, ybound=<UNSET>, ylabel=<UNSET>, ylim=<UNSET>, ymargin=<UNSET>, yscale=<UNSET>, yticklabels=<UNSET>, yticks=<UNSET>, zorder=<UNSET>) [edit on github]

Set multiple properties at once.

Supported properties are

Properties:

adjustable: {‘box’, ‘datalim’} agg_filter: a filter function, which takes a (m, n, 3) float array and a dpi value, and returns a (m, n, 3) array alpha: scalar or None anchor: (float, float) or {‘C’, ‘SW’, ‘S’, ‘SE’, ‘E’, ‘NE’, …} animated: bool aspect: {‘auto’, ‘equal’} or float autoscale_on: bool autoscalex_on: bool autoscaley_on: bool axes_locator: Callable[[Axes, Renderer], Bbox] axisbelow: bool or ‘line’ box_aspect: float or None clip_box: Bbox clip_on: bool clip_path: Patch or (Path, Transform) or None facecolor or fc: color figure: Figure frame_on: bool gid: str in_layout: bool label: object navigate: bool navigate_mode: unknown path_effects: AbstractPathEffect picker: None or bool or float or callable position: [left, bottom, width, height] or Bbox prop_cycle: unknown rasterization_zorder: float or None rasterized: bool sketch_params: (scale: float, length: float, randomness: float) snap: bool or None title: str transform: Transform url: str visible: bool xbound: unknown xlabel: unknown xlim: (bottom: float, top: float) xmargin: float greater than -0.5 xscale: {“linear”, “log”, “symlog”, “logit”, …} or ScaleBase xticklabels: unknown xticks: unknown ybound: unknown ylabel: unknown ylim: (bottom: float, top: float) ymargin: float greater than -0.5 yscale: {“linear”, “log”, “symlog”, “logit”, …} or ScaleBase yticklabels: unknown yticks: unknown zorder: float