Skip to content

Commit f9f736a

Browse files
authored
Merge pull request #22837 from meeseeksmachine/auto-backport-of-pr-22807-on-v3.5.x
Backport PR #22807 on branch v3.5.x (Replace quiver dpi callback with reinit-on-dpi-changed.)
2 parents be101a3 + 1af2857 commit f9f736a

File tree

1 file changed

+12
-50
lines changed

1 file changed

+12
-50
lines changed

lib/matplotlib/quiver.py

+12-50
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
"""
1616

1717
import math
18-
import weakref
1918

2019
import numpy as np
2120
from numpy import ma
@@ -273,21 +272,6 @@ def __init__(self, Q, X, Y, U, label,
273272
self.color = color
274273
self.label = label
275274
self._labelsep_inches = labelsep
276-
self.labelsep = (self._labelsep_inches * Q.axes.figure.dpi)
277-
278-
# try to prevent closure over the real self
279-
weak_self = weakref.ref(self)
280-
281-
def on_dpi_change(fig):
282-
self_weakref = weak_self()
283-
if self_weakref is not None:
284-
self_weakref.labelsep = self_weakref._labelsep_inches * fig.dpi
285-
# simple brute force update works because _init is called at
286-
# the start of draw.
287-
self_weakref._initialized = False
288-
289-
self._cid = Q.axes.figure.callbacks.connect(
290-
'dpi_changed', on_dpi_change)
291275

292276
self.labelpos = labelpos
293277
self.labelcolor = labelcolor
@@ -303,18 +287,16 @@ def on_dpi_change(fig):
303287

304288
if self.labelcolor is not None:
305289
self.text.set_color(self.labelcolor)
306-
self._initialized = False
290+
self._dpi_at_last_init = None
307291
self.zorder = Q.zorder + 0.1
308292

309-
def remove(self):
310-
# docstring inherited
311-
self.Q.axes.figure.callbacks.disconnect(self._cid)
312-
self._cid = None
313-
super().remove() # pass the remove call up the stack
293+
@property
294+
def labelsep(self):
295+
return self._labelsep_inches * self.Q.axes.figure.dpi
314296

315297
def _init(self):
316-
if True: # not self._initialized:
317-
if not self.Q._initialized:
298+
if True: # self._dpi_at_last_init != self.axes.figure.dpi
299+
if self.Q._dpi_at_last_init != self.Q.axes.figure.dpi:
318300
self.Q._init()
319301
self._set_transform()
320302
with cbook._setattr_cm(self.Q, pivot=self.pivot[self.labelpos],
@@ -337,7 +319,7 @@ def _init(self):
337319
self.vector.set_color(self.color)
338320
self.vector.set_transform(self.Q.get_transform())
339321
self.vector.set_figure(self.get_figure())
340-
self._initialized = True
322+
self._dpi_at_last_init = self.Q.axes.figure.dpi
341323

342324
def _text_x(self, x):
343325
if self.labelpos == 'E':
@@ -508,26 +490,7 @@ def __init__(self, ax, *args,
508490
closed=False, **kw)
509491
self.polykw = kw
510492
self.set_UVC(U, V, C)
511-
self._initialized = False
512-
513-
weak_self = weakref.ref(self) # Prevent closure over the real self.
514-
515-
def on_dpi_change(fig):
516-
self_weakref = weak_self()
517-
if self_weakref is not None:
518-
# vertices depend on width, span which in turn depend on dpi
519-
self_weakref._new_UV = True
520-
# simple brute force update works because _init is called at
521-
# the start of draw.
522-
self_weakref._initialized = False
523-
524-
self._cid = ax.figure.callbacks.connect('dpi_changed', on_dpi_change)
525-
526-
def remove(self):
527-
# docstring inherited
528-
self.axes.figure.callbacks.disconnect(self._cid)
529-
self._cid = None
530-
super().remove() # pass the remove call up the stack
493+
self._dpi_at_last_init = None
531494

532495
def _init(self):
533496
"""
@@ -536,18 +499,19 @@ def _init(self):
536499
"""
537500
# It seems that there are not enough event notifications
538501
# available to have this work on an as-needed basis at present.
539-
if True: # not self._initialized:
502+
if True: # self._dpi_at_last_init != self.axes.figure.dpi
540503
trans = self._set_transform()
541504
self.span = trans.inverted().transform_bbox(self.axes.bbox).width
542505
if self.width is None:
543506
sn = np.clip(math.sqrt(self.N), 8, 25)
544507
self.width = 0.06 * self.span / sn
545508

546509
# _make_verts sets self.scale if not already specified
547-
if not self._initialized and self.scale is None:
510+
if (self._dpi_at_last_init != self.axes.figure.dpi
511+
and self.scale is None):
548512
self._make_verts(self.U, self.V, self.angles)
549513

550-
self._initialized = True
514+
self._dpi_at_last_init = self.axes.figure.dpi
551515

552516
def get_datalim(self, transData):
553517
trans = self.get_transform()
@@ -563,7 +527,6 @@ def draw(self, renderer):
563527
self._init()
564528
verts = self._make_verts(self.U, self.V, self.angles)
565529
self.set_verts(verts, closed=False)
566-
self._new_UV = False
567530
super().draw(renderer)
568531
self.stale = False
569532

@@ -592,7 +555,6 @@ def set_UVC(self, U, V, C=None):
592555
self.Umask = mask
593556
if C is not None:
594557
self.set_array(C)
595-
self._new_UV = True
596558
self.stale = True
597559

598560
def _dots_per_unit(self, units):

0 commit comments

Comments
 (0)