Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit f4e07c2

Browse files
authored
Merge pull request #12544 from meeseeksmachine/auto-backport-of-pr-12159-on-v3.0.x
Backport PR #12159 on branch v3.0.x (FIX: colorbar re-check norm before draw for autolabels)
2 parents ac0ec7c + d540ad9 commit f4e07c2

File tree

2 files changed

+33
-4
lines changed

2 files changed

+33
-4
lines changed

lib/matplotlib/colorbar.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,8 @@ def tick_values(self, vmin, vmax):
241241
vmin = max(vmin, self._colorbar.norm.vmin)
242242
vmax = min(vmax, self._colorbar.norm.vmax)
243243
ticks = super().tick_values(vmin, vmax)
244-
return ticks[(ticks >= vmin) & (ticks <= vmax)]
244+
rtol = (vmax - vmin) * 1e-10
245+
return ticks[(ticks >= vmin - rtol) & (ticks <= vmax + rtol)]
245246

246247

247248
class _ColorbarAutoMinorLocator(ticker.AutoMinorLocator):
@@ -297,7 +298,10 @@ def tick_values(self, vmin, vmax):
297298
vmin = self._colorbar.norm.vmin
298299
vmax = self._colorbar.norm.vmax
299300
ticks = super().tick_values(vmin, vmax)
300-
return ticks[(ticks >= vmin) & (ticks <= vmax)]
301+
rtol = (np.log10(vmax) - np.log10(vmin)) * 1e-10
302+
ticks = ticks[(np.log10(ticks) >= np.log10(vmin) - rtol) &
303+
(np.log10(ticks) <= np.log10(vmax) + rtol)]
304+
return ticks
301305

302306

303307
class ColorbarBase(cm.ScalarMappable):
@@ -406,7 +410,6 @@ def __init__(self, ax, cmap=None,
406410
else:
407411
self.formatter = format # Assume it is a Formatter
408412
# The rest is in a method so we can recalculate when clim changes.
409-
self.config_axis()
410413
self.draw_all()
411414

412415
def _extend_lower(self):
@@ -440,6 +443,7 @@ def draw_all(self):
440443
# units:
441444
X, Y = self._mesh()
442445
C = self._values[:, np.newaxis]
446+
self.config_axis()
443447
self._config_axes(X, Y)
444448
if self.filled:
445449
self._add_solids(X, Y, C)
@@ -594,6 +598,7 @@ def _config_axes(self, X, Y):
594598
ax.set_frame_on(False)
595599
ax.set_navigate(False)
596600
xy = self._outline(X, Y)
601+
ax.ignore_existing_data_limits = True
597602
ax.update_datalim(xy)
598603
ax.set_xlim(*ax.dataLim.intervalx)
599604
ax.set_ylim(*ax.dataLim.intervaly)
@@ -1151,7 +1156,6 @@ def update_bruteforce(self, mappable):
11511156
self.set_alpha(mappable.get_alpha())
11521157
self.cmap = mappable.cmap
11531158
self.norm = mappable.norm
1154-
self.config_axis()
11551159
self.draw_all()
11561160
if isinstance(self.mappable, contour.ContourSet):
11571161
CS = self.mappable

lib/matplotlib/tests/test_colorbar.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from matplotlib.colors import BoundaryNorm, LogNorm, PowerNorm
88
from matplotlib.cm import get_cmap
99
from matplotlib.colorbar import ColorbarBase
10+
from matplotlib.ticker import LogLocator, LogFormatter
1011

1112

1213
def _get_cmap_norms():
@@ -411,3 +412,27 @@ def test_colorbar_log_minortick_labels():
411412
r'$\mathdefault{4\times10^{4}}$']
412413
for l, exp in zip(lb, expected):
413414
assert l.get_text() == exp
415+
416+
417+
def test_colorbar_renorm():
418+
x, y = np.ogrid[-4:4:31j, -4:4:31j]
419+
z = 120000*np.exp(-x**2 - y**2)
420+
421+
fig, ax = plt.subplots()
422+
im = ax.imshow(z)
423+
cbar = fig.colorbar(im)
424+
425+
norm = LogNorm(z.min(), z.max())
426+
im.set_norm(norm)
427+
cbar.set_norm(norm)
428+
cbar.locator = LogLocator()
429+
cbar.formatter = LogFormatter()
430+
cbar.update_normal(im)
431+
assert np.isclose(cbar.vmin, z.min())
432+
433+
norm = LogNorm(z.min() * 1000, z.max() * 1000)
434+
im.set_norm(norm)
435+
cbar.set_norm(norm)
436+
cbar.update_normal(im)
437+
assert np.isclose(cbar.vmin, z.min() * 1000)
438+
assert np.isclose(cbar.vmax, z.max() * 1000)

0 commit comments

Comments
 (0)