@@ -600,6 +600,10 @@ class Axis(martist.Artist):
600
600
# The class used in _get_tick() to create tick instances. Must either be
601
601
# overwritten in subclasses, or subclasses must reimplement _get_tick().
602
602
_tick_class = None
603
+ converter = _api .deprecate_privatize_attribute (
604
+ "3.10" ,
605
+ alternative = "get_converter and set_converter methods"
606
+ )
603
607
604
608
def __str__ (self ):
605
609
return "{}({},{})" .format (
@@ -656,7 +660,8 @@ def __init__(self, axes, *, pickradius=15, clear=True):
656
660
if clear :
657
661
self .clear ()
658
662
else :
659
- self .converter = None
663
+ self ._converter = None
664
+ self ._converter_is_explicit = False
660
665
self .units = None
661
666
662
667
self ._autoscale_on = True
@@ -886,7 +891,8 @@ def clear(self):
886
891
mpl .rcParams ['axes.grid.which' ] in ('both' , 'minor' ))
887
892
self .reset_ticks ()
888
893
889
- self .converter = None
894
+ self ._converter = None
895
+ self ._converter_is_explicit = False
890
896
self .units = None
891
897
self .stale = True
892
898
@@ -1738,16 +1744,20 @@ def grid(self, visible=None, which='major', **kwargs):
1738
1744
def update_units (self , data ):
1739
1745
"""
1740
1746
Introspect *data* for units converter and update the
1741
- ``axis.converter `` instance if necessary. Return *True*
1747
+ ``axis.get_converter `` instance if necessary. Return *True*
1742
1748
if *data* is registered for unit conversion.
1743
1749
"""
1744
- converter = munits .registry .get_converter (data )
1750
+ if not self ._converter_is_explicit :
1751
+ converter = munits .registry .get_converter (data )
1752
+ else :
1753
+ converter = self ._converter
1754
+
1745
1755
if converter is None :
1746
1756
return False
1747
1757
1748
- neednew = self .converter != converter
1749
- self .converter = converter
1750
- default = self .converter .default_units (data , self )
1758
+ neednew = self ._converter != converter
1759
+ self ._set_converter ( converter )
1760
+ default = self ._converter .default_units (data , self )
1751
1761
if default is not None and self .units is None :
1752
1762
self .set_units (default )
1753
1763
@@ -1761,10 +1771,10 @@ def _update_axisinfo(self):
1761
1771
Check the axis converter for the stored units to see if the
1762
1772
axis info needs to be updated.
1763
1773
"""
1764
- if self .converter is None :
1774
+ if self ._converter is None :
1765
1775
return
1766
1776
1767
- info = self .converter .axisinfo (self .units , self )
1777
+ info = self ._converter .axisinfo (self .units , self )
1768
1778
1769
1779
if info is None :
1770
1780
return
@@ -1791,25 +1801,58 @@ def _update_axisinfo(self):
1791
1801
self .set_default_intervals ()
1792
1802
1793
1803
def have_units (self ):
1794
- return self .converter is not None or self .units is not None
1804
+ return self ._converter is not None or self .units is not None
1795
1805
1796
1806
def convert_units (self , x ):
1797
1807
# If x is natively supported by Matplotlib, doesn't need converting
1798
1808
if munits ._is_natively_supported (x ):
1799
1809
return x
1800
1810
1801
- if self .converter is None :
1802
- self .converter = munits .registry .get_converter (x )
1811
+ if self ._converter is None :
1812
+ self ._set_converter ( munits .registry .get_converter (x ) )
1803
1813
1804
- if self .converter is None :
1814
+ if self ._converter is None :
1805
1815
return x
1806
1816
try :
1807
- ret = self .converter .convert (x , self .units , self )
1817
+ ret = self ._converter .convert (x , self .units , self )
1808
1818
except Exception as e :
1809
1819
raise munits .ConversionError ('Failed to convert value(s) to axis '
1810
1820
f'units: { x !r} ' ) from e
1811
1821
return ret
1812
1822
1823
+ def get_converter (self ):
1824
+ """
1825
+ Get the unit converter for axis.
1826
+
1827
+ Returns
1828
+ -------
1829
+ `~matplotlib.units.ConversionInterface` or None
1830
+ """
1831
+ return self ._converter
1832
+
1833
+ def set_converter (self , converter ):
1834
+ """
1835
+ Set the unit converter for axis.
1836
+
1837
+ Parameters
1838
+ ----------
1839
+ converter : `~matplotlib.units.ConversionInterface`
1840
+ """
1841
+ self ._set_converter (converter )
1842
+ self ._converter_is_explicit = True
1843
+
1844
+ def _set_converter (self , converter ):
1845
+ if self ._converter == converter :
1846
+ return
1847
+ if self ._converter_is_explicit :
1848
+ raise RuntimeError ("Axis already has an explicit converter set" )
1849
+ elif self ._converter is not None :
1850
+ _api .warn_external (
1851
+ "This axis already has a converter set and "
1852
+ "is updating to a potentially incompatible converter"
1853
+ )
1854
+ self ._converter = converter
1855
+
1813
1856
def set_units (self , u ):
1814
1857
"""
1815
1858
Set the units for axis.
@@ -2529,8 +2572,8 @@ def set_default_intervals(self):
2529
2572
# not changed the view:
2530
2573
if (not self .axes .dataLim .mutatedx () and
2531
2574
not self .axes .viewLim .mutatedx ()):
2532
- if self .converter is not None :
2533
- info = self .converter .axisinfo (self .units , self )
2575
+ if self ._converter is not None :
2576
+ info = self ._converter .axisinfo (self .units , self )
2534
2577
if info .default_limits is not None :
2535
2578
xmin , xmax = self .convert_units (info .default_limits )
2536
2579
self .axes .viewLim .intervalx = xmin , xmax
@@ -2759,8 +2802,8 @@ def set_default_intervals(self):
2759
2802
# not changed the view:
2760
2803
if (not self .axes .dataLim .mutatedy () and
2761
2804
not self .axes .viewLim .mutatedy ()):
2762
- if self .converter is not None :
2763
- info = self .converter .axisinfo (self .units , self )
2805
+ if self ._converter is not None :
2806
+ info = self ._converter .axisinfo (self .units , self )
2764
2807
if info .default_limits is not None :
2765
2808
ymin , ymax = self .convert_units (info .default_limits )
2766
2809
self .axes .viewLim .intervaly = ymin , ymax
0 commit comments