Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit f4e07c2

Browse filesBrowse 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
Copy full SHA for f4e07c2

File tree

Expand file treeCollapse file tree

2 files changed

+33
-4
lines changed
Filter options
Expand file treeCollapse file tree

2 files changed

+33
-4
lines changed

‎lib/matplotlib/colorbar.py

Copy file name to clipboardExpand all lines: lib/matplotlib/colorbar.py
+8-4Lines 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

Copy file name to clipboardExpand all lines: lib/matplotlib/tests/test_colorbar.py
+25Lines 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 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.