From 3e4203bb184c6203a6afd745e2b05d4a1ac1b520 Mon Sep 17 00:00:00 2001 From: Steven Silvester Date: Sat, 12 Dec 2015 12:37:24 -0600 Subject: [PATCH] Allow axes to be provided to imshow and fix colorbar Allow axes to be provided to imshow and fix colorbar Allow axes to be provided to imshow and fix colorbar Allow axes to be provided to imshow and fix colorbar Use tight layout by default Try and fix appveyor issue Handle deprecation warning on appveyor Pin the colorbar to the image using box-forced Fix tests again Update function signature Update function signature Fix imshow call Fix docstring with utf characters Remove kwargs --- skimage/io/_plugins/matplotlib_plugin.py | 22 ++++++++++++++++------ skimage/io/tests/test_mpl_imshow.py | 5 +++-- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/skimage/io/_plugins/matplotlib_plugin.py b/skimage/io/_plugins/matplotlib_plugin.py index a9754a72640..e958cc36496 100644 --- a/skimage/io/_plugins/matplotlib_plugin.py +++ b/skimage/io/_plugins/matplotlib_plugin.py @@ -2,6 +2,7 @@ import numpy as np import warnings 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 e369273a23e..26482f64be2 100644 --- a/skimage/io/tests/test_mpl_imshow.py +++ b/skimage/io/tests/test_mpl_imshow.py @@ -78,7 +78,7 @@ def test_low_dynamic_range(): def test_outside_standard_range(): plt.figure() - with expected_warnings(["out of standard range"]): + 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 +87,8 @@ def test_outside_standard_range(): def test_nonstandard_type(): plt.figure() - with expected_warnings(["Low image dynamic range"]): + + 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