diff --git a/lib/matplotlib/colorbar.py b/lib/matplotlib/colorbar.py index 8cf8c0e6c1eb..ec88549dc49f 100644 --- a/lib/matplotlib/colorbar.py +++ b/lib/matplotlib/colorbar.py @@ -1221,8 +1221,10 @@ def _proportional_y(self): if (isinstance(self.norm, colors.BoundaryNorm) or self.boundaries is not None): y = (self._boundaries - self._boundaries[self._inside][0]) - y = y / (self._boundaries[self._inside][-1] - - self._boundaries[self._inside][0]) + if (self._boundaries[self._inside][-1] + != self._boundaries[self._inside][0]): + y = y / (self._boundaries[self._inside][-1] - + self._boundaries[self._inside][0]) # need yscaled the same as the axes scale to get # the extend lengths. if self.spacing == 'uniform': @@ -1243,10 +1245,13 @@ def _proportional_y(self): yscaled = np.ma.filled(norm(yscaled), np.nan) # make the lower and upper extend lengths proportional to the lengths # of the first and last boundary spacing (if extendfrac='auto'): - automin = yscaled[1] - yscaled[0] - automax = yscaled[-1] - yscaled[-2] extendlength = [0, 0] if self._extend_lower() or self._extend_upper(): + automin = yscaled[0] + automax = yscaled[0] + if len(yscaled) > 1: + automin = yscaled[1] - yscaled[0] + automax = yscaled[-1] - yscaled[-2] extendlength = self._get_extension_lengths( self.extendfrac, automin, automax, default=0.05) return y, extendlength diff --git a/lib/matplotlib/tests/test_colorbar.py b/lib/matplotlib/tests/test_colorbar.py index 149ed4c3d22e..428627f2ccef 100644 --- a/lib/matplotlib/tests/test_colorbar.py +++ b/lib/matplotlib/tests/test_colorbar.py @@ -242,6 +242,15 @@ def test_contour_colorbar(): fig.colorbar(CS, orientation='vertical') +def test_contour_uniformfield_colorbar(): + # Smoke test for gh#23817 + fig, ax = plt.subplots() + with pytest.warns(Warning) as record: + cs = ax.contour([[1, 1], [1, 1]]) + assert len(record) == 1 + fig.colorbar(cs, ax=ax) + + @image_comparison(['cbar_with_subplots_adjust.png'], remove_text=True, savefig_kwarg={'dpi': 40}) def test_gridspec_make_colorbar():