@@ -1619,6 +1619,8 @@ def __init__(self, *args, **kwargs):
1619
1619
will be removed. If prune==None, no ticks will be removed.
1620
1620
1621
1621
"""
1622
+ self ._fine_steps = [1 , 1.5 , 2 , 2.5 , 3 , 4 , 5 , 6 , 8 , 10 ]
1623
+ self ._fine_int_steps = [1 , 2 , 3 , 4 , 5 , 6 , 8 , 10 ]
1622
1624
if args :
1623
1625
kwargs ['nbins' ] = args [0 ]
1624
1626
if len (args ) > 1 :
@@ -1631,8 +1633,11 @@ def set_params(self, **kwargs):
1631
1633
"""Set parameters within this locator."""
1632
1634
if 'nbins' in kwargs :
1633
1635
self ._nbins = kwargs ['nbins' ]
1634
- if self ._nbins != 'auto' :
1635
- self ._nbins = int (self ._nbins )
1636
+ if self ._nbins != 'auto' :
1637
+ self ._nbins = int (self ._nbins )
1638
+ self ._steps2 = None
1639
+ else :
1640
+ self ._steps2 = self ._fine_steps
1636
1641
if 'trim' in kwargs :
1637
1642
warnings .warn (
1638
1643
"The 'trim' keyword has no effect since version 2.0." ,
@@ -1650,7 +1655,8 @@ def set_params(self, **kwargs):
1650
1655
if 'steps' in kwargs :
1651
1656
steps = kwargs ['steps' ]
1652
1657
if steps is None :
1653
- self ._steps = [1 , 1.5 , 2 , 2.5 , 3 , 4 , 5 , 6 , 8 , 10 ]
1658
+ self ._steps = self ._fine_steps
1659
+ self ._steps2 = None
1654
1660
else :
1655
1661
if int (steps [- 1 ]) != 10 :
1656
1662
steps = list (steps )
@@ -1660,11 +1666,19 @@ def set_params(self, **kwargs):
1660
1666
self ._integer = kwargs ['integer' ]
1661
1667
if self ._integer :
1662
1668
self ._steps = [n for n in self ._steps if _divmod (n , 1 )[1 ] < 0.001 ]
1669
+ if self ._steps2 is not None :
1670
+ self ._steps2 = self ._fine_int_steps
1663
1671
1664
- def _raw_ticks (self , vmin , vmax ):
1672
+ def _raw_ticks (self , vmin , vmax , steps = None ):
1673
+ if steps is None :
1674
+ steps = self ._steps
1665
1675
nbins = self ._nbins
1666
1676
if nbins == 'auto' :
1667
- nbins = max (min (self .axis .get_tick_space (), 9 ), 1 )
1677
+ if (rcParams ['axes.autolimit_mode' ] == 'round_numbers'
1678
+ and self ._prune is None ):
1679
+ nbins = max (min (self .axis .get_tick_space (), 9 ), 2 )
1680
+ else :
1681
+ nbins = max (min (self .axis .get_tick_space (), 9 ), 4 )
1668
1682
scale , offset = scale_range (vmin , vmax , nbins )
1669
1683
if self ._integer :
1670
1684
scale = max (1 , scale )
@@ -1675,20 +1689,24 @@ def _raw_ticks(self, vmin, vmax):
1675
1689
best_vmax = vmax
1676
1690
best_vmin = vmin
1677
1691
1678
- for step in self . _steps :
1692
+ for step in steps :
1679
1693
if step < scaled_raw_step :
1680
1694
continue
1681
1695
step *= scale
1682
- best_vmin = vmin // step * step
1696
+ best_vmin = ( vmin // step ) * step
1683
1697
best_vmax = best_vmin + step * nbins
1684
1698
if best_vmax >= vmax :
1685
1699
break
1686
1700
1687
1701
# More than nbins may be required, e.g. vmin, vmax = -4.1, 4.1 gives
1688
1702
# nbins=9 but 10 bins are actually required after rounding. So we just
1689
1703
# create the bins that span the range we need instead.
1690
- low = round (Base (step ).le (vmin - best_vmin ) / step )
1691
- high = round (Base (step ).ge (vmax - best_vmin ) / step )
1704
+ if rcParams ['axes.autolimit_mode' ] == 'round_numbers' :
1705
+ low = round (Base (step ).le (vmin - best_vmin ) / step )
1706
+ high = round (Base (step ).ge (vmax - best_vmin ) / step )
1707
+ else :
1708
+ low = round (Base (step ).ge (vmin - best_vmin ) / step )
1709
+ high = round (Base (step ).le (vmax - best_vmin ) / step )
1692
1710
return np .arange (low , high + 1 ) * step + best_vmin + offset
1693
1711
1694
1712
@cbook .deprecated ("2.0" )
@@ -1703,7 +1721,15 @@ def tick_values(self, vmin, vmax):
1703
1721
vmin , vmax = mtransforms .nonsingular (
1704
1722
vmin , vmax , expander = 1e-13 , tiny = 1e-14 )
1705
1723
locs = self ._raw_ticks (vmin , vmax )
1724
+ locs = [loc for loc in locs if vmax >= loc >= vmin ]
1725
+ nlocs = len (locs )
1706
1726
prune = self ._prune
1727
+ if prune in ('lower' , 'upper' ):
1728
+ nlocs -= 1
1729
+ elif prune == 'both' :
1730
+ nlocs -= 2
1731
+ if self ._steps2 and nlocs < 2 :
1732
+ locs = self ._raw_ticks (vmin , vmax , self ._steps2 )
1707
1733
if prune == 'lower' :
1708
1734
locs = locs [1 :]
1709
1735
elif prune == 'upper' :
0 commit comments