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

All projections support the center argument, while some support additional arguments. The globe projections also support the rotate argument, and the zoom projections also supports the radius and rotate arguments.

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: 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>, mouseover=<UNSET>, navigate=<UNSET>, path_effects=<UNSET>, picker=<UNSET>, position=<UNSET>, prop_cycle=<UNSET>, rasterization_zorder=<UNSET>, rasterized=<UNSET>, sketch_params=<UNSET>, snap=<UNSET>, subplotspec=<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 and two offsets from the bottom left corner of the image 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: unknown autoscaley_on: unknown axes_locator: Callable[[Axes, Renderer], Bbox] axisbelow: bool or ‘line’ box_aspect: float or None clip_box: BboxBase or None 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 mouseover: bool navigate: bool navigate_mode: unknown path_effects: list of AbstractPathEffect picker: None or bool or float or callable position: [left, bottom, width, height] or Bbox prop_cycle: Cycler rasterization_zorder: float or None rasterized: bool sketch_params: (scale: float, length: float, randomness: float) snap: bool or None subplotspec: unknown title: str transform: Transform url: str visible: bool xbound: (lower: float, upper: float) xlabel: unknown xlim: (left: float, right: float) xmargin: float greater than -0.5 xscale: unknown xticklabels: unknown xticks: unknown ybound: (lower: float, upper: float) ylabel: unknown ylim: (bottom: float, top: float) ymargin: float greater than -0.5 yscale: unknown yticklabels: unknown yticks: unknown zorder: float