@@ -263,7 +263,7 @@ def __init__(self, Q, X, Y, U, label,
263
263
The key label (e.g., length and units of the key).
264
264
angle : float, default: 0
265
265
The angle of the key arrow, in degrees anti-clockwise from the
266
- x- axis.
266
+ horizontal axis.
267
267
coordinates : {'axes', 'figure', 'data', 'inches'}, default: 'axes'
268
268
Coordinate system and units for *X*, *Y*: 'axes' and 'figure' are
269
269
normalized coordinate systems with (0, 0) in the lower left and
@@ -327,10 +327,8 @@ def _init(self):
327
327
Umask = ma .nomask ):
328
328
u = self .U * np .cos (np .radians (self .angle ))
329
329
v = self .U * np .sin (np .radians (self .angle ))
330
- angle = (self .Q .angles if isinstance (self .Q .angles , str )
331
- else 'uv' )
332
- self .verts = self .Q ._make_verts (
333
- np .array ([u ]), np .array ([v ]), angle )
330
+ self .verts = self .Q ._make_verts ([[0. , 0. ]],
331
+ np .array ([u ]), np .array ([v ]), 'uv' )
334
332
kwargs = self .Q .polykw
335
333
kwargs .update (self .kw )
336
334
self .vector = mcollections .PolyCollection (
@@ -521,7 +519,7 @@ def _init(self):
521
519
# _make_verts sets self.scale if not already specified
522
520
if (self ._dpi_at_last_init != self .axes .figure .dpi
523
521
and self .scale is None ):
524
- self ._make_verts (self .U , self .V , self .angles )
522
+ self ._make_verts (self .XY , self . U , self .V , self .angles )
525
523
526
524
self ._dpi_at_last_init = self .axes .figure .dpi
527
525
@@ -537,7 +535,7 @@ def get_datalim(self, transData):
537
535
@martist .allow_rasterization
538
536
def draw (self , renderer ):
539
537
self ._init ()
540
- verts = self ._make_verts (self .U , self .V , self .angles )
538
+ verts = self ._make_verts (self .XY , self . U , self .V , self .angles )
541
539
self .set_verts (verts , closed = False )
542
540
super ().draw (renderer )
543
541
self .stale = False
@@ -594,33 +592,38 @@ def _set_transform(self):
594
592
self .set_transform (trans )
595
593
return trans
596
594
597
- def _angles_lengths (self , U , V , eps = 1 ):
598
- xy = self .axes .transData .transform (self .XY )
595
+ # Calculate angles and lengths for segment between (x, y), (x+u, y+v)
596
+ def _angles_lengths (self , XY , U , V , eps = 1 ):
597
+ xy = self .axes .transData .transform (XY )
599
598
uv = np .column_stack ((U , V ))
600
- xyp = self .axes .transData .transform (self . XY + eps * uv )
599
+ xyp = self .axes .transData .transform (XY + eps * uv )
601
600
dxy = xyp - xy
602
601
angles = np .arctan2 (dxy [:, 1 ], dxy [:, 0 ])
603
602
lengths = np .hypot (* dxy .T ) / eps
604
603
return angles , lengths
605
604
606
- def _make_verts (self , U , V , angles ):
605
+ # XY is stacked [X, Y].
606
+ # See quiver() doc for meaning of X, Y, U, V, angles.
607
+ def _make_verts (self , XY , U , V , angles ):
607
608
uv = (U + V * 1j )
608
609
str_angles = angles if isinstance (angles , str ) else ''
609
610
if str_angles == 'xy' and self .scale_units == 'xy' :
610
611
# Here eps is 1 so that if we get U, V by diffing
611
612
# the X, Y arrays, the vectors will connect the
612
613
# points, regardless of the axis scaling (including log).
613
- angles , lengths = self ._angles_lengths (U , V , eps = 1 )
614
+ angles , lengths = self ._angles_lengths (XY , U , V , eps = 1 )
614
615
elif str_angles == 'xy' or self .scale_units == 'xy' :
615
616
# Calculate eps based on the extents of the plot
616
617
# so that we don't end up with roundoff error from
617
618
# adding a small number to a large.
618
619
eps = np .abs (self .axes .dataLim .extents ).max () * 0.001
619
- angles , lengths = self ._angles_lengths (U , V , eps = eps )
620
+ angles , lengths = self ._angles_lengths (XY , U , V , eps = eps )
621
+
620
622
if str_angles and self .scale_units == 'xy' :
621
623
a = lengths
622
624
else :
623
625
a = np .abs (uv )
626
+
624
627
if self .scale is None :
625
628
sn = max (10 , math .sqrt (self .N ))
626
629
if self .Umask is not ma .nomask :
@@ -630,6 +633,7 @@ def _make_verts(self, U, V, angles):
630
633
# crude auto-scaling
631
634
# scale is typical arrow length as a multiple of the arrow width
632
635
scale = 1.8 * amean * sn / self .span
636
+
633
637
if self .scale_units is None :
634
638
if self .scale is None :
635
639
self .scale = scale
0 commit comments