8000 Replace quiver dpi callback with reinit-on-dpi-changed. · matplotlib/matplotlib@952e0b1 · GitHub
[go: up one dir, main page]

Skip to content

Commit 952e0b1

Browse files
committed
Replace quiver dpi callback with reinit-on-dpi-changed.
Instead of registering a callback to update itself whenever the dpi changes, do the same thing as every other artist which depends on dpi (e.g. FancyArrowPatch), i.e. update oneself as needed. We can still save duplicate calculations by only doing the init if the figure dpi changed compared to last time. Also drop _new_UV, which is never read.
1 parent f1c3444 commit 952e0b1

File tree

1 file changed

+12
-50
lines changed

1 file changed

+12
-50
lines changed

lib/matplotlib/quiver.py

Lines changed: 12 additions & 50 deletions
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
@@ -299,21 +298,6 @@ def __init__(self, Q, X, Y, U, label,
299298
self.color = color
300299
self.label = label
301300
self._labelsep_inches = labelsep
302-
self.labelsep = (self._labelsep_inches * Q.axes.figure.dpi)
303-
304-
# try to prevent closure over the real self
305-
weak_self = weakref.ref(self)
306-
307-
def on_dpi_change(fig):
308-
self_weakref = weak_self()
309-
if self_weakref is not None:
310-
self_weakref.labelsep = self_weakref._labelsep_inches * fig.dpi
311-
# simple brute force update works because _init is called at
312-
# the start of draw.
313-
self_weakref._initialized = False
314-
315-
self._cid = Q.axes.figure.callbacks.connect(
316-
'dpi_changed', on_dpi_change)
317301

318302
self.labelpos = labelpos
319303
self.labelcolor = labelcolor
@@ -329,18 +313,16 @@ def on_dpi_change(fig):
329313

330314
if self.labelcolor is not None:
331315
self.text.set_color(self.labelcolor)
332-
self._initialized = False
316+
self._dpi_at_last_init = None
333317
self.zorder = Q.zorder + 0.1
334318

335-
def remove(self):
336-
# docstring inherited
337-
self.Q.axes.figure.callbacks.disconnect(self._cid)
338-
self._cid = None
339-
super().remove() # pass the remove call up the stack
319+
@property
320+
def labelsep(self):
321+
return self._labelsep_inches * self.Q.axes.figure.dpi
340322

341323
def _init(self):
342-
if True: # not self._initialized:
343-
if not self.Q._initialized:
324+
if True: # self._dpi_at_last_init != self.axes.figure.dpi
325+
if self.Q._dpi_at_last_init != self.Q.axes.figure.dpi:
344326
self.Q._init()
345327
self._set_transform()
346328
with cbook._setattr_cm(self.Q, pivot=self.pivot[self.labelpos],
@@ -363,7 +345,7 @@ def _init(self):
363345
self.vector.set_color(self.color)
364 8000 346
self.vector.set_transform(self.Q.get_transform())
365347
self.vector.set_figure(self.get_figure())
366-
self._initialized = True
348+
self._dpi_at_last_init = self.Q.axes.figure.dpi
367349

368350
def _text_x(self, x):
369351
if self.labelpos == 'E':
@@ -534,26 +516,7 @@ def __init__(self, ax, *args,
534516
closed=False, **kwargs)
535517
self.polykw = kwargs
536518
self.set_UVC(U, V, C)
537-
self._initialized = False
538-
539-
weak_self = weakref.ref(self) # Prevent closure over the real self.
540-
541-
def on_dpi_change(fig):
542-
self_weakref = weak_self()
543-
if self_weakref is not None:
544-
# vertices depend on width, span which in turn depend on dpi
545-
self_weakref._new_UV = True
546-
# simple brute force update works because _init is called at
547-
# the start of draw.
548-
self_weakref._initialized = False
549-
550-
self._cid = ax.figure.callbacks.connect('dpi_changed', on_dpi_change)
551-
552-
def remove(self):
553-
# docstring inherited
554-
self.axes.figure.callbacks.disconnect(self._cid)
555-
self._cid = None
556-
super().remove() # pass the remove call up the stack
519+
self._dpi_at_last_init = None
557520

558521
def _init(self):
559522
"""
@@ -562,18 +525,19 @@ def _init(self):
562525
"""
563526
# It seems that there are not enough event notifications
564527
# available to have this work on an as-needed basis at present.
565-
if True: # not self._initialized:
528+
if True: # self._dpi_at_last_init != self.axes.figure.dpi
566529
trans = self._set_transform()
567530
self.span = trans.inverted().transform_bbox(self.axes.bbox).width
568531
if self.width is None:
569532
sn = np.clip(math.sqrt(self.N), 8, 25)
570533
self.width = 0.06 * self.span / sn
571534

572535
# _make_verts sets self.scale if not already specified
573-
if not self._initialized and self.scale is None:
536+
if (self._dpi_at_last_init != self.axes.figure.dpi
537+
and self.scale is None):
574538
self._make_verts(self.U, self.V, self.angles)
575539

576-
self._initialized = True
540+
self._dpi_at_last_init = self.axes.figure.dpi
577541

578542
def get_datalim(self, transData):
579543
trans = self.get_transform()
@@ -589,7 +553,6 @@ def draw(self, renderer):
589553
self._init()
590554
verts = self._make_verts(self.U, self.V, self.angles)
591555
self.set_verts(verts, closed=False)
592-
self._new_UV = False
593556
super().draw(renderer)
594557
self.stale = False
595558

@@ -618,7 +581,6 @@ def set_UVC(self, U, V, C=None):
618581
self.Umask = mask
619582
if C is not None:
620583
self.set_array(C)
621-
self._new_UV = True
622584
self.stale = True
623585

624586
def _dots_per_unit(self, units):

0 commit comments

Comments
 (0)
0