Source code for sunpy.visualization.visualization
"""
This module provides plotting support in iPython.
"""
from functools import wraps
import matplotlib.pyplot as plt
import astropy.units as u
from astropy.visualization.wcsaxes import CoordinateHelper
__all__ = ['peek_show', "axis_labels_from_ctype", "show_hpr_impact_angle"]
[docs]
def peek_show(func):
"""
A decorator to place on ``peek()`` methods to show the figure.
The ``peek()`` method should return the figure then this method will
attempt to show it in the correct way. This decorator will not return the
figure to the user.
"""
@wraps(func)
def show_figure(*args, **kwargs):
_ = func(*args, **kwargs)
plt.show()
return show_figure
[docs]
def axis_labels_from_ctype(ctype, unit):
"""
Returns axis labels for the given coordinate type and unit.
Parameters
----------
ctype : `str`
Coordinate type.
unit : `str`, `None`
Required unit. If `None` no unit is added to the label.
Returns
-------
`str`
"Axis Label [Unit]"
"""
ctype_short = ctype[:4]
labels = {'HGLN': 'Heliographic Longitude',
'CRLN': 'Carrington Longitude',
'HPLN': 'Helioprojective Longitude (Solar-X)',
'HRLN': 'Helioprojective Position Angle',
'SOLX': 'Heliocentric X',
'HGLT': 'Latitude',
'CRLT': 'Latitude',
'HPLT': 'Helioprojective Latitude (Solar-Y)',
'HRLT': 'Helioprojective Declination',
'SOLY': 'Heliocentric Y'}
label = labels.get(ctype_short, f"{ctype}")
if unit is not None:
label += f' [{unit}]'
return label
[docs]
def show_hpr_impact_angle(declination_axis):
"""
Modify a declination axis for Helioprojective Radial plots to show impact angle
instead.
In order to accommodate the FITS-WCS machinery, the declination is used instead
of the impact angle (which is the declination plus 90 degrees). This function
changes the tick-label formatter for an axis so that it adds 90 degrees before
rendering the labels.
Parameters
----------
coordinate_axis : `astropy.visualization.wcsaxes.CoordinateHelper`
The coordinate axis for Helioprojective Radial declination (``delta``)
See Also
--------
sunpy.coordinates.HelioprojectiveRadial
Examples
--------
.. minigallery:: sunpy.visualization.show_hpr_impact_angle
"""
if not isinstance(declination_axis, CoordinateHelper):
raise TypeError("The input should be one of the WCSAxes coordinate axes.")
old_format_method = declination_axis.formatter
def new_format_method(values, spacing, format="auto"):
return old_format_method(values + 90*u.deg, spacing, format=format)
# TODO: Astropy >= 7.0 use declination_axis.set_major_formatter(new_format_method)
declination_axis._formatter_locator.formatter = new_format_method
declination_axis.set_axislabel('Helioprojective Impact Angle')