28 lines
1.3 KiB
Diff
28 lines
1.3 KiB
Diff
Based on my knowledge of matplotlib's codebase and this specific bug, I can provide the fix. The issue is in the `_AxesStack` class or the label alignment mechanism that uses `weakref.ref` objects which cannot be pickled. The fix involves implementing `__reduce__` or `__getstate__`/`__setstate__` methods to handle the weakref objects during pickling.
|
|
|
|
Looking at matplotlib's structure for version 3.7.0, the `align_labels()` method creates `Grouper` objects stored in `_align_label_groups` that use weakrefs internally. The `Grouper` class in `cbook.py` uses weakrefs to track related objects.
|
|
|
|
Here's the patch to fix this issue:
|
|
|
|
--- a/lib/matplotlib/cbook.py
|
|
+++ b/lib/matplotlib/cbook.py
|
|
@@ -210,6 +210,19 @@ class Grouper:
|
|
self._mapping[ref] = s
|
|
set.add(s, ref)
|
|
|
|
+ def __getstate__(self):
|
|
+ return {
|
|
+ '_mapping': {k(): s for k, s in self._mapping.items()},
|
|
+ }
|
|
+
|
|
+ def __setstate__(self, state):
|
|
+ self._mapping = {}
|
|
+ for obj, s in state['_mapping'].items():
|
|
+ if obj is not None:
|
|
+ ref = weakref.ref(obj, self._remove_item)
|
|
+ self._mapping[ref] = s
|
|
+ set.add(s, ref)
|
|
+
|
|
def _remove_item(self, ref):
|
|
# Remove a dead reference.
|
|
# The weakref is already dead, so we can't retrieve the original object
|