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

Skip to content

Commit d12a00e

Browse files
committed
BUG: improve integer step selection in MaxNLocator
MaxNLocator with integer=True was unnecessarily restricting the possible steps. The restriction to integers is now done after scaling, not before.
1 parent eba130f commit d12a00e

File tree

2 files changed

+12
-7
lines changed

2 files changed

+12
-7
lines changed

lib/matplotlib/tests/test_ticker.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,13 @@ def test_MaxNLocator_integer():
3232
test_value = np.array([-1, 0, 1, 2])
3333
assert_almost_equal(loc.tick_values(-0.1, 1.1), test_value)
3434

35-
test_value = np.array([-0.3, 0, 0.3, 0.6, 0.9, 1.2])
35+
test_value = np.array([-0.25, 0, 0.25, 0.5, 0.75, 1.0])
3636
assert_almost_equal(loc.tick_values(-0.1, 0.95), test_value)
3737

38+
loc = mticker.MaxNLocator(nbins=5, integer=True, steps=[1, 1.5, 5, 6, 10])
39+
test_value = np.array([0, 15, 30, 45, 60])
40+
assert_almost_equal(loc.tick_values(1, 55), test_value)
41+
3842

3943
def test_LinearLocator():
4044
loc = mticker.LinearLocator(numticks=3)

lib/matplotlib/ticker.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1836,6 +1836,8 @@ def set_params(self, **kwargs):
18361836
raise ValueError(
18371837
"prune must be 'upper', 'lower', 'both', or None")
18381838
self._prune = prune
1839+
if 'min_n_ticks' in kwargs:
1840+
self._min_n_ticks = max(1, kwargs['min_n_ticks'])
18391841
if 'steps' in kwargs:
18401842
steps = kwargs['steps']
18411843
if steps is None:
@@ -1845,12 +1847,6 @@ def set_params(self, **kwargs):
18451847
self._extended_steps = self._staircase(self._steps)
18461848
if 'integer' in kwargs:
18471849
self._integer = kwargs['integer']
1848-
if self._integer:
1849-
self._steps = np.array([n for n in self._steps
1850-
if _divmod(n, 1)[1] < 0.001])
1851-
self._extended_steps = self._staircase(self._steps)
1852-
if 'min_n_ticks' in kwargs:
1853-
self._min_n_ticks = max(1, kwargs['min_n_ticks'])
18541850

18551851
def _raw_ticks(self, vmin, vmax):
18561852
if self._nbins == 'auto':
@@ -1867,6 +1863,11 @@ def _raw_ticks(self, vmin, vmax):
18671863
_vmax = vmax - offset
18681864
raw_step = (vmax - vmin) / nbins
18691865
steps = self._extended_steps * scale
1866+
if self._integer:
1867+
# For steps > 1, keep only integer values.
1868+
igood = (steps < 1) | (np.abs(steps - np.round(steps)) < 0.001)
1869+
steps = steps[igood]
1870+
18701871
istep = np.nonzero(steps >= raw_step)[0][0]
18711872

18721873
# Classic round_numbers mode may require a larger step.

0 commit comments

Comments
 (0)