8000 FIX: CenterNorm setting vmin/vmax should keep symmetry · matplotlib/matplotlib@48272bf · GitHub
[go: up one dir, main page]

Skip to content

Commit 48272bf

Browse files
committed
FIX: CenterNorm setting vmin/vmax should keep symmetry
This fixes the case where someone explicitly sets vmin or vmax by keeping vcenter fixed and also updating vmax or vmin respectively, ensuring that the halfrange is the same on each side of vcenter.
1 parent ff2811b commit 48272bf

File tree

2 files changed

+37
-0
lines changed

2 files changed

+37
-0
lines changed

lib/matplotlib/colors.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1532,6 +1532,30 @@ def autoscale_None(self, A):
15321532
if self.halfrange is None and A.size:
15331533
self.autoscale(A)
15341534

1535+
@property
1536+
def vmin(self):
1537+
return self._vmin
1538+
1539+
@vmin.setter
1540+
def vmin(self, value):
1541+
value = _sanitize_extrema(value)
1542+
if value != self._vmin:
1543+
self._vmin = value
1544+
self._vmax = 2*self.vcenter - value
1545+
self._changed()
1546+
1547+
@property
1548+
def vmax(self):
1549+
return self._vmax
1550+
1551+
@vmax.setter
1552+
def vmax(self, value):
1553+
value = _sanitize_extrema(value)
1554+
if value != self._vmax:
1555+
self._vmax = value
1556+
self._vmin = 2*self.vcenter - value
1557+
self._changed()
1558+
15351559
@property
15361560
def vcenter(self):
15371561
return self._vcenter

lib/matplotlib/tests/test_colors.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -492,6 +492,19 @@ def test_CenteredNorm():
492492
assert norm.vmax == 2
493493
assert norm.halfrange == 1
494494

495+
# Check setting vmin directly updates the halfrange and vmax, but
496+
# leaves vcenter alone
497+
norm.vmin = -1
498+
assert norm.halfrange == 2
499+
assert norm.vmax == 3
500+
assert norm.vcenter == 1
501+
502+
# also check vmax updates
503+
norm.vmax = 2
504+
assert norm.halfrange == 1
505+
assert norm.vmin == 0
506+
assert norm.vcenter == 1
507+
495508

496509
@pytest.mark.parametrize("vmin,vmax", [[-1, 2], [3, 1]])
497510
def test_lognorm_invalid(vmin, vmax):

0 commit comments

Comments
 (0)
0