Skip to content

Commit eda3939

Browse files
authored
Merge pull request #19119 from anntzer/pickle-unit-change-handlers
Don't lose unit change handlers when pickling/unpickling.
2 parents 67aa50d + 037d4c6 commit eda3939

File tree

3 files changed

+26
-32
lines changed

3 files changed

+26
-32
lines changed

lib/matplotlib/axes/_base.py

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from collections import OrderedDict
22
from contextlib import ExitStack
3+
import functools
34
import inspect
45
import itertools
56
import logging
@@ -561,13 +562,10 @@ def __init__(self, fig, rect,
561562

562563
self.update(kwargs)
563564

564-
if self.xaxis is not None:
565-
self._xcid = self.xaxis.callbacks.connect(
566-
'units finalize', lambda: self._on_units_changed(scalex=True))
567-
568-
if self.yaxis is not None:
569-
self._ycid = self.yaxis.callbacks.connect(
570-
'units finalize', lambda: self._on_units_changed(scaley=True))
565+
for name, axis in self._get_axis_map().items():
566+
axis.callbacks._pickled_cids.add(
567+
axis.callbacks.connect(
568+
'units finalize', self._unit_change_handler(name)))
571569

572570
rcParams = mpl.rcParams
573571
self.tick_params(
@@ -2130,14 +2128,17 @@ def add_container(self, container):
21302128
container._remove_method = self.containers.remove
21312129
return container
21322130

2133-
def _on_units_changed(self, scalex=False, scaley=False):
2131+
def _unit_change_handler(self, axis_name, event=None):
21342132
"""
2135-
Callback for processing changes to axis units.
2136-
2137-
Currently requests updates of data limits and view limits.
2133+
Process axis units changes: requests updates to data and view limits.
21382134
"""
2135+
if event is None: # Allow connecting `self._unit_change_handler(name)`
2136+
return functools.partial(
2137+
self._unit_change_handler, axis_name, event=object())
2138+
_api.check_in_list(self._get_axis_map(), axis_name=axis_name)
21392139
self.relim()
2140-
self._request_autoscale_view(scalex=scalex, scaley=scaley)
2140+
self._request_autoscale_view(scalex=(axis_name == "x"),
2141+
scaley=(axis_name == "y"))
21412142

21422143
def relim(self, visible_only=False):
21432144
"""

lib/matplotlib/lines.py

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -627,13 +627,9 @@ def axes(self, ax):
627627
# call the set method from the base-class property
628628
Artist.axes.fset(self, ax)
629629
if ax is not None:
630-
# connect unit-related callbacks
631-
if ax.xaxis is not None:
632-
self._xcid = ax.xaxis.callbacks.connect('units',
633-
self.recache_always)
634-
if ax.yaxis is not None:
635-
self._ycid = ax.yaxis.callbacks.connect('units',
636-
self.recache_always)
630+
for axis in ax._get_axis_map().values():
631+
axis.callbacks._pickled_cids.add(
632+
axis.callbacks.connect('units', self.recache_always))
637633

638634
def set_data(self, *args):
639635
"""

lib/mpl_toolkits/mplot3d/axes3d.py

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
"""
1212

1313
from collections import defaultdict
14+
import functools
1415
from functools import reduce
1516
from itertools import compress
1617
import math
@@ -111,12 +112,6 @@ def __init__(
111112
# func used to format z -- fall back on major formatters
112113
self.fmt_zdata = None
113114

114-
if self.zaxis is not None:
115-
self._zcid = self.zaxis.callbacks.connect(
116-
'units finalize', lambda: self._on_units_changed(scalez=True))
117-
else:
118-
self._zcid = None
119-
120115
self.mouse_init()
121116
self.figure.canvas.callbacks._pickled_cids.update({
122117
self.figure.canvas.mpl_connect(
@@ -475,14 +470,16 @@ def get_axis_position(self):
475470
zhigh = tc[0][2] > tc[2][2]
476471
return xhigh, yhigh, zhigh
477472

478-
def _on_units_changed(self, scalex=False, scaley=False, scalez=False):
479-
"""
480-
Callback for processing changes to axis units.
481-
482-
Currently forces updates of data limits and view limits.
483-
"""
473+
def _unit_change_handler(self, axis_name, event=None):
474+
# docstring inherited
475+
if event is None: # Allow connecting `self._unit_change_handler(name)`
476+
return functools.partial(
477+
self._unit_change_handler, axis_name, event=object())
478+
_api.check_in_list(self._get_axis_map(), axis_name=axis_name)
484479
self.relim()
485-
self.autoscale_view(scalex=scalex, scaley=scaley, scalez=scalez)
480+
self.autoscale_view(scalex=(axis_name == "x"),
481+
scaley=(axis_name == "y"),
482+
scalez=(axis_name == "z"))
486483

487484
def update_datalim(self, xys, **kwargs):
488485
pass

0 commit comments

Comments
 (0)