Skip to content

Fix a cropping issue with irispy#923

Closed
nabobalis wants to merge 2 commits intosunpy:mainfrom
nabobalis:main
Closed

Fix a cropping issue with irispy#923
nabobalis wants to merge 2 commits intosunpy:mainfrom
nabobalis:main

Conversation

@nabobalis
Copy link
Copy Markdown
Member

@nabobalis nabobalis commented Mar 30, 2026

I decided to use preserve_units as I pin to astropy 7.2 for irispy and it causes cropping issues now with the WCS where I was cropping to a location to get a 1D spectra from a 3D cube.

  File "/home/nabil/Git/irispy/examples/misc/00_v34_rasters.py", line 101, in <module>
    mg_ii_k_unflipped_spectra = mg_ii_k_unflipped[0].crop(lower_corner, lower_corner)
  File "/home/nabil/.local/share/mamba/envs/irispy/lib/python3.14/site-packages/ndcube/ndcube.py", line 626, in crop
    item = self._get_crop_item(*points, wcs=wcs, keepdims=keepdims)
  File "/home/nabil/.local/share/mamba/envs/irispy/lib/python3.14/site-packages/ndcube/utils/cube.py", line 58, in wcs_wrapper
    return func(*params.args, **params.kwargs)
  File "/home/nabil/.local/share/mamba/envs/irispy/lib/python3.14/site-packages/ndcube/ndcube.py", line 652, in _get_crop_item
    return utils.cube.get_crop_item_from_points(points, wcs, False, keepdims=keepdims,
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                                                original_shape=self.data.shape)
                                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/nabil/.local/share/mamba/envs/irispy/lib/python3.14/site-packages/ndcube/utils/cube.py", line 218, in get_crop_item_from_points
    raise ValueError(f"All world points associated with array axis {array_axis}"
                     " are outside the range of the NDCube being cropped.")
ValueError: All world points associated with array axis 0 are outside the range of the NDCube being cropped.

This patch fixes that, but maybe it's actually a bug upstream but I don't know.

@nabobalis
Copy link
Copy Markdown
Member Author

Failure here is:

171   >>> ax = my_cube.plot(wcs=my_cube.combined_wcs)
UNEXPECTED EXCEPTION: RuntimeWarning('invalid value encountered in do_format (vectorized)')
Traceback (most recent call last):
  File "<doctest visualization.rst[44]>", line 1, in <module>
  File "/home/runner/work/ndcube/ndcube/.tox/py314/lib/python3.14/site-packages/ndcube/ndcube.py", line 950, in plot
    return self.plotter.plot(*args, **kwargs)
           ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
  File "/home/runner/work/ndcube/ndcube/.tox/py314/lib/python3.14/site-packages/ndcube/visualization/mpl_plotter.py", line 89, in plot
    ax = self._animate_cube(plot_wcs, plot_axes=plot_axes,
                            axes_coordinates=axes_coordinates,
                            axes_units=axes_units, data_unit=data_unit, **kwargs)
  File "/home/runner/work/ndcube/ndcube/.tox/py314/lib/python3.14/site-packages/ndcube/visualization/mpl_plotter.py", line 207, in _animate_cube
    ax = ArrayAnimatorWCS(data, wcs, plot_axes, coord_params=coord_params, **kwargs)
  File "/home/runner/work/ndcube/ndcube/.tox/py314/lib/python3.14/site-packages/mpl_animators/wcs.py", line 106, in __init__
    super().__init__(data, image_axes=image_axes, axis_ranges=None,
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                     slider_labels=slider_labels,
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                     **kwargs)
                     ^^^^^^^^^
  File "/home/runner/work/ndcube/ndcube/.tox/py314/lib/python3.14/site-packages/mpl_animators/base.py", line 489, in __init__
    super().__init__(data, **base_kwargs)
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/ndcube/ndcube/.tox/py314/lib/python3.14/site-packages/mpl_animators/base.py", line 124, in __init__
    self._add_widgets()
    ~~~~~~~~~~~~~~~~~^^
  File "/home/runner/work/ndcube/ndcube/.tox/py314/lib/python3.14/site-packages/mpl_animators/base.py", line 353, in _add_widgets
    sframe = widgets.Slider(self.sliders[-1], "",
                            self.slider_ranges[i][0],
                            self.slider_ranges[i][-1]-1,
                            valinit=self.slider_ranges[i][0],
                            valfmt='%4.1f')
  File "/home/runner/work/ndcube/ndcube/.tox/py314/lib/python3.14/site-packages/matplotlib/widgets.py", line 497, in __init__
    self.set_val(valinit)
    ~~~~~~~~~~~~^^^^^^^^^
  File "/home/runner/work/ndcube/ndcube/.tox/py314/lib/python3.14/site-packages/matplotlib/widgets.py", line 572, in set_val
    self.ax.get_figure(root=True).canvas.draw_idle()
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
  File "/home/runner/work/ndcube/ndcube/.tox/py314/lib/python3.14/site-packages/matplotlib/backend_bases.py", line 1893, in draw_idle
    self.draw(*args, **kwargs)
    ~~~~~~~~~^^^^^^^^^^^^^^^^^
  File "/home/runner/work/ndcube/ndcube/.tox/py314/lib/python3.14/site-packages/matplotlib/backends/backend_agg.py", line 382, in draw
    self.figure.draw(self.renderer)
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^
  File "/home/runner/work/ndcube/ndcube/.tox/py314/lib/python3.14/site-packages/matplotlib/artist.py", line 94, in draw_wrapper
    result = draw(artist, renderer, *args, **kwargs)
  File "/home/runner/work/ndcube/ndcube/.tox/py314/lib/python3.14/site-packages/matplotlib/artist.py", line 71, in draw_wrapper
    return draw(artist, renderer)
  File "/home/runner/work/ndcube/ndcube/.tox/py314/lib/python3.14/site-packages/matplotlib/figure.py", line 3257, in draw
    mimage._draw_list_compositing_images(
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
        renderer, self, artists, self.suppressComposite)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/ndcube/ndcube/.tox/py314/lib/python3.14/site-packages/matplotlib/image.py", line 134, in _draw_list_compositing_images
    a.draw(renderer)
    ~~~~~~^^^^^^^^^^
  File "/home/runner/work/ndcube/ndcube/.tox/py314/lib/python3.14/site-packages/matplotlib/artist.py", line 38, in draw_wrapper
    return draw(artist, renderer, *args, **kwargs)
  File "/home/runner/work/ndcube/ndcube/.tox/py314/lib/python3.14/site-packages/astropy/visualization/wcsaxes/core.py", line 591, in draw
    super().draw(renderer)
    ~~~~~~~~~~~~^^^^^^^^^^
  File "/home/runner/work/ndcube/ndcube/.tox/py314/lib/python3.14/site-packages/matplotlib/artist.py", line 71, in draw_wrapper
    return draw(artist, renderer)
  File "/home/runner/work/ndcube/ndcube/.tox/py314/lib/python3.14/site-packages/matplotlib/axes/_base.py", line 3226, in draw
    mimage._draw_list_compositing_images(
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
        renderer, self, artists, self.get_figure(root=True).suppressComposite)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/ndcube/ndcube/.tox/py314/lib/python3.14/site-packages/matplotlib/image.py", line 134, in _draw_list_compositing_images
    a.draw(renderer)
    ~~~~~~^^^^^^^^^^
  File "/home/runner/work/ndcube/ndcube/.tox/py314/lib/python3.14/site-packages/matplotlib/artist.py", line 38, in draw_wrapper
    return draw(artist, renderer, *args, **kwargs)
  File "/home/runner/work/ndcube/ndcube/.tox/py314/lib/python3.14/site-packages/astropy/visualization/wcsaxes/core.py", line 48, in draw
    self.axes.draw_wcsaxes(renderer)
    ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^
  File "/home/runner/work/ndcube/ndcube/.tox/py314/lib/python3.14/site-packages/astropy/visualization/wcsaxes/core.py", line 529, in draw_wcsaxes
    self._update_tick_and_label_positions(keep_coord_range=True)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/ndcube/ndcube/.tox/py314/lib/python3.14/site-packages/astropy/visualization/wcsaxes/core.py", line 507, in _update_tick_and_label_positions
    coord._update_ticks()
    ~~~~~~~~~~~~~~~~~~~^^
  File "/home/runner/work/ndcube/ndcube/.tox/py314/lib/python3.14/site-packages/astropy/visualization/wcsaxes/coordinate_helpers.py", line 1106, in _update_ticks
    text = self.formatter(u.Quantity(self._lbl_world), spacing=self._fl_spacing)
  File "/home/runner/work/ndcube/ndcube/.tox/py314/lib/python3.14/site-packages/astropy/visualization/wcsaxes/formatter_locator.py", line 498, in formatter
    string = angles.to_string(
             ~~~~~~~~~~~~~~~~^
        unit=unit,
        ^^^^^^^^^^
    ...<5 lines>...
        alwayssign=self._alwayssign,
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    ).tolist()
    ^
  File "/home/runner/work/ndcube/ndcube/.tox/py314/lib/python3.14/site-packages/astropy/coordinates/angles/core.py", line 387, in to_string
    result = format_ufunc(self.to_value(unit))
  File "/home/runner/work/ndcube/ndcube/.tox/py314/lib/python3.14/site-packages/numpy/lib/_function_base_impl.py", line 2518, in __call__
    return self._call_as_normal(*args, **kwargs)
           ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
  File "/home/runner/work/ndcube/ndcube/.tox/py314/lib/python3.14/site-packages/numpy/lib/_function_base_impl.py", line 2511, in _call_as_normal
    return self._vectorize_call(func=func, args=vargs)
           ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/runner/work/ndcube/ndcube/.tox/py314/lib/python3.14/site-packages/numpy/lib/_function_base_impl.py", line 2599, in _vectorize_call
    outputs = ufunc(*args, out=...)
RuntimeWarning: invalid value encountered in do_format (vectorized)

@Cadair
Copy link
Copy Markdown
Member

Cadair commented Mar 31, 2026

This feels wrong, have you got an example which triggers the bug so I can poke?

@nabobalis
Copy link
Copy Markdown
Member Author

I think this more likely an upstream issue: https://github.com/astropy/astropy/pull/19506/changes but I don't know for sure.

Simplest example is to install irispy from main and run the v34 example under the misc folder. But even that is a lot of code.

@nabobalis nabobalis closed this Apr 1, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants