diff --git a/.travis.yml b/.travis.yml index d3c10f2c..7cc52075 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,8 +18,8 @@ addons: packages: - ccache - libfreeimage3 - - texlive - - texlive-latex-extra + - texlive + - texlive-latex-extra - dvipng - python-qt4 env: diff --git a/skimage/io/_plugins/matplotlib_plugin.py b/skimage/io/_plugins/matplotlib_plugin.py index 154317cd..34afb7ff 100644 --- a/skimage/io/_plugins/matplotlib_plugin.py +++ b/skimage/io/_plugins/matplotlib_plugin.py @@ -1,6 +1,7 @@ from collections import namedtuple import numpy as np import matplotlib.pyplot as plt +from mpl_toolkits.axes_grid1 import make_axes_locatable from ...util import dtype as dtypes from ...exposure import is_low_contrast from ...util.colormap import viridis @@ -110,7 +111,7 @@ def _get_display_range(image): return lo, hi, cmap -def imshow(im, *args, **kwargs): +def imshow(im, ax=None, show_cbar=None, **kwargs): """Show the input image and return the current axes. By default, the image is displayed in greyscale, rather than @@ -131,8 +132,11 @@ def imshow(im, *args, **kwargs): ---------- im : array, shape (M, N[, 3]) The image to display. - - *args, **kwargs : positional and keyword arguments + ax: `matplotlib.axes.Axes`, optional + The axis to use for the image, defaults to plt.gca(). + show_cbar: boolean, optional. + Whether to show the colorbar (used to override default behavior). + **kwargs : Keyword arguments These are passed directly to `matplotlib.pyplot.imshow`. Returns @@ -147,9 +151,15 @@ def imshow(im, *args, **kwargs): kwargs.setdefault('cmap', cmap) kwargs.setdefault('vmin', lo) kwargs.setdefault('vmax', hi) - ax_im = plt.imshow(im, *args, **kwargs) - if cmap != _default_colormap: - plt.colorbar() + + ax = ax or plt.gca() + ax_im = ax.imshow(im, **kwargs) + if (cmap != _default_colormap and show_cbar is not False) or show_cbar: + divider = make_axes_locatable(ax) + cax = divider.append_axes("right", size="5%", pad=0.05) + plt.colorbar(ax_im, cax=cax) + ax.set_adjustable('box-forced') + ax.get_figure().tight_layout() return ax_im imread = plt.imread diff --git a/skimage/io/tests/test_mpl_imshow.py b/skimage/io/tests/test_mpl_imshow.py index e369273a..76422580 100644 --- a/skimage/io/tests/test_mpl_imshow.py +++ b/skimage/io/tests/test_mpl_imshow.py @@ -78,7 +78,11 @@ def test_low_dynamic_range(): def test_outside_standard_range(): plt.figure() - with expected_warnings(["out of standard range"]): + # Warning raised by matplotlib on Windows: + # "The CObject type is marked Pending Deprecation in Python 2.7. + # Please use capsule objects instead." + # Ref: https://docs.python.org/2/c-api/cobject.html + with expected_warnings(["out of standard range|CObject type is marked"]): ax_im = io.imshow(im_hi) assert ax_im.get_clim() == (im_hi.min(), im_hi.max()) assert n_subplots(ax_im) == 2 @@ -87,7 +91,11 @@ def test_outside_standard_range(): def test_nonstandard_type(): plt.figure() - with expected_warnings(["Low image dynamic range"]): + # Warning raised by matplotlib on Windows: + # "The CObject type is marked Pending Deprecation in Python 2.7. + # Please use capsule objects instead." + # Ref: https://docs.python.org/2/c-api/cobject.html + with expected_warnings(["Low image dynamic range|CObject type is marked"]): ax_im = io.imshow(im64) assert ax_im.get_clim() == (im64.min(), im64.max()) assert n_subplots(ax_im) == 2