Source code for scisalt.matplotlib.Imshow_Slider

# import matplotlib.pyplot as _plt

import os as _os
on_rtd = _os.environ.get('READTHEDOCS', None) == 'True'
if not on_rtd:
    import matplotlib.widgets as _wdg
    import numpy as _np

from .setup_figure import setup_figure   # noqa


[docs]class Imshow_Slider(object): """ .. versionchanged:: 1.2 Name changed, colorbar options added, *p* changed to :class:`AxesImage <scisalt.matplotlib.Imshow_Slider.AxesImage>`. Convenience class for viewing images. Plots *image* to a to an instance of :class:`matplotlib.axis.imshow(**kwargs)`, with sliders for controlling bounds, with *\*\*kwargs* passed through to :meth:`matplotlib.axes.Axes.imshow`. *usecbar* determines if a colorbar will be used. Color bars can slow down the viewer significantly. """ def __init__(self, image, usecbar=False, **kwargs): # ====================================== # Save input info # ====================================== self._image = image self._kwargs = kwargs self.usecbar = usecbar # ====================================== # Create figure # ====================================== self.fig, self.gs = setup_figure(20, 10) self._ax_img = self.fig.add_subplot(self.gs[0:-3, :]) self.ax_min = self.fig.add_subplot(self.gs[-2, 1:-1]) self.ax_max = self.fig.add_subplot(self.gs[-1, 1:-1]) self._reset(**kwargs) def _reset(self, **kwargs): # ====================================== # Strip kwargs for vmin, vmax # in order to set sliders correctly # ====================================== minslide = kwargs.get('vmin', self.imgmin) maxslide = kwargs.get('vmax', self.imgmax) # ====================================== # Imshow # ====================================== self._AxesImage = self.ax.imshow(self._image, **kwargs) # ====================================== # Add minimum slider # ====================================== self.minslider = _wdg.Slider(self.ax_min, 'Min', self.imgmin, self.imgmax, minslide) # ====================================== # Add maximum slider # ====================================== self.maxslider = _wdg.Slider(self.ax_max, 'Max', self.imgmin, self.imgmax, maxslide, slidermin=self.minslider) self.minslider.slidermax = self.maxslider self.minslider.on_changed(self._update_clim) self.maxslider.on_changed(self._update_clim) if self.usecbar: self.fig.colorbar(self.AxesImage, ax=self.ax, use_gridspec=True) self.fig.tight_layout()
[docs] def set_cmap(self, cmap): """ Sets color map to *cmap*. """ self.AxesImage.set_cmap(cmap)
@property def AxesImage(self): """ The :class:`matplotlib.image.AxesImage` from :meth:`matplotlib.axes.Axes.imshow`. """ return self._AxesImage @property def ax(self): """ The :class:`matplotlib.axes.Axes` used for :meth:`matplotlib.axes.Axes.imshow`. """ return self._ax_img # ====================================== # Get min of image # ====================================== @property def imgmax(self): """ Highest value of input image. """ return _np.max(self._image) # ====================================== # Get max of image # ====================================== @property def imgmin(self): """ Lowest value of input image. """ return _np.min(self._image) # ====================================== # Update the clims # ====================================== def _update_clim(self, val): cmin = self.minslider.val cmax = self.maxslider.val # print('Cmin: {}, Cmax: {}'.format(cmin, cmax)) self.AxesImage.set_clim(cmin, cmax) # ====================================== # Easily get and set slider # ====================================== @property def clim_min(self): """ Slider value for minimum """ return self.minslider.val @clim_min.setter def clim_min(self, val): self.minslider.set_val(val) @property def clim_max(self): """ Slider value for maximum """ return self.maxslider.val @clim_max.setter def clim_max(self, val): self.maxslider.set_val(val)