What’s New in SunPy 4.0?

The SunPy project is pleased to announce the 4.0 release of the sunpy core package.

On this page, you can read about some of the big changes in this release.

SunPy 4.0 also includes a large number of smaller improvements and bug fixes, which are described in the Full Changelog.

By the numbers:

This release of sunpy contains 1310 commits in 182 merged pull requests closing 83 issues from 29 people, 19 of which are first-time contributors to sunpy.

  • 1310 commits have been added since 3.1

  • 83 issues have been closed since 3.1

  • 182 pull requests have been merged since 3.1

  • 29 people have contributed since 3.1

  • 19 of which are new contributors

The people who have contributed to the code for this release are:

  • Akash Verma *

  • Alasdair Wilson *

  • Albert Y. Shih

  • Alex Kaszynski *

  • Alex W *

  • Andy Tang *

  • Anubhav Sinha *

  • Chris Bard *

  • Conor MacBride

  • Daniel Garcia Briseno *

  • David Stansby

  • Devansh Shukla *

  • Jan Gieseler *

  • Jeffrey Aaron Paul

  • Jia Qing *

  • Karthikeyan Singaravelan *

  • Krish Agrawal *

  • Laura Hayes

  • Lazar Zivadinovic

  • Nabil Freij

  • Noah Altunian *

  • Rohan Sharma *

  • Samriddhi Agarwal

  • Stuart Mumford

  • Thomas Braccia *

  • Tim Gates *

  • Will Barnes

  • William Russell *

Where a * indicates that this release contains their first contribution to sunpy.

Increase in required package versions

We have bumped the minimum version of several packages we depend on; these are the new minimum versions:

  • python >= 3.8

Improvements to map and image rotation

There have been significant improvements to sunpy.map.GenericMap.rotate() and sunpy.image.transform.affine_transform(). Most notably, there is now comprehensive support for having not-a-number (NaN) values in pixels, with NaNs now preserved across image rotation. Accordingly, the default behavior for these functions has been changed to use NaN for the pixels in the output image that are beyond the extent of the input image. To obtain the prior behavior, which used zero by default for such pixels, the missing needs to be explicitly set to zero.

The default rotation function used internally has been switched to scipy.ndimage.affine_transform() from skimage.transform.warp() due to changes in the latest release of scikit-image, although the differences between the rotation results are small. Since bicubic interpolation by scipy.ndimage.affine_transform() is sufficient in quality for the typical user, we have changed the default interpolation order for sunpy.map.GenericMap.rotate() to bicubic interpolation (order=3) instead of biquartic interpolation (order=4) for improved performance under default settings. sunpy.image.transform.affine_transform() has always defaulted to bicubic interpolation (order=3).

Also, there is now the option to rotate using OpenCV. The rotation function to use can be selected via the method keyword argument. New rotation functions beyond these three can be added using the new decorator add_rotation_function().

Improved return types of HEK queries

The ‘event_endtime’, ‘event_starttime’ and ‘event_peaktime’ columns in a HEK query are now returned as Time objects.

Drawing Carrington coordinate grids

It is now easy to draw Carrington coordinate grids on top of maps using sunpy.map.GenericMap.draw_grid() by specifying system='carrington'. See Plotting a coordinate grid for an example.

Better printing of metadata

Printing a MetaDict now prints each entry on a new line, making it much easier to read:

>>> from sunpy.data.sample import AIA_171_IMAGE  
>>> from sunpy.map import Map
>>> m = Map(AIA_171_IMAGE)  
>>> print(m.meta)  
simple: True
bitpix: -32
naxis: 2
naxis1: 1024
naxis2: 1024

Deprecation of sunpy.image.coalignment

The sunpy.image.coalignment module has been deprecated and will be removed in version 4.1. Users should instead use sunkit_image.coalignment which includes identical functionality and an identical API. The reason for deprecating and moving sunpy.image.coalignment is twofold. First, the scope of the core sunpy package has increasingly narrowed, with more analysis-specific functionality moved out to affiliated packages. Second, the module has seen little development in several years and by moving it to sunkit_image.coalignment, we hope to increase its visibility and attract a larger number of contributors.

Deprecation of sunpy.io.fits

The sunpy.io.fits module is deprecated, and will be removed in version 4.1. This because it was designed for internal use only, and removing it from the public API gives the developers more flexibility to modify it without impacting users. The astropy.io.fits module can be used instead as a replacement that is designed to be user-facing.

Deprecation of sunpy.physics.solar_rotation

sunpy.physics.solar_rotation.calculate_solar_rotate_shift and sunpy.physics.solar_rotation.mapsequence_solar_derotate have been deprecated and will be removed in version 4.1. Both of these functions have been moved to sunkit_image.coalignment and have identical functionality and API. Note that mapsequence_solar_derotate has been renamed to mapsequence_coalign_by_rotation to more accurately reflect its functionality.

New dependency on asdf-astropy for ASDF support

With the 4.0 release of sunpy the asdf plugin has been updated to support future versions of the asdf Python library. This has lead to no significant changes to how ASDF files are handled on save or load, however the plugin code is significantly simpler.

When updating sunpy to 4.0 it is important that the asdf-astropy package is installed if asdf is installed. If installing sunpy with sunpy[all] or sunpy[asdf] when using pip this will happen automatically, however, if you update sunpy with pip install -U sunpy and you have previously installed asdf (implicitly or explicitly) you will need to install the asdf-astropy package. If you have installed sunpy with conda, you don’t need to do anything as the conda package has been updated to depend on asdf and asdf-astropy. If asdf-astropy is not installed then sunpy’s asdf plugin will fail to load and emit a warning, this will happen every time for any ASDF file irrespective of if it contains a sunpy object in its tree.

Deprecation of shift and shifted_value

The method sunpy.map.GenericMap.shift has been renamed sunpy.map.GenericMap.shift_reference_coord and shift has been deprecated. The method has been renamed to make it clear that it is the reference coordinate that is being shifted and not the image itself. Additionally, the sunpy.map.GenericMap.shifted_value property, which keeps track of the shifts applied by shift, has been deprecated. Users should instead use the CRVAL1 and CRVAL2 keys in sunpy.map.GenericMap.meta.modified_items to see how the reference coordinate has been modified. Note that shift_reference_coord does not modify shifted_value.

Contributors to this Release

The people who have contributed to the code for this release are:

TODO: fill this in at release time.

Where a * indicates that this release contains their first contribution to SunPy.