From: <ef...@us...> - 2009-11-30 22:50:24
|
Revision: 7993 http://matplotlib.svn.sourceforge.net/matplotlib/?rev=7993&view=rev Author: efiring Date: 2009-11-30 21:38:58 +0000 (Mon, 30 Nov 2009) Log Message: ----------- Make the kwarg combination "units='xy', angles='xy', scale=1" work as expected Modified Paths: -------------- trunk/matplotlib/lib/matplotlib/quiver.py Modified: trunk/matplotlib/lib/matplotlib/quiver.py =================================================================== --- trunk/matplotlib/lib/matplotlib/quiver.py 2009-11-30 21:13:34 UTC (rev 7992) +++ trunk/matplotlib/lib/matplotlib/quiver.py 2009-11-30 21:38:58 UTC (rev 7993) @@ -64,7 +64,7 @@ Keyword arguments: - *units*: ['width' | 'height' | 'dots' | 'inches' | 'x' | 'y' ] + *units*: ['width' | 'height' | 'dots' | 'inches' | 'x' | 'y' | 'xy'] arrow units; the arrow dimensions *except for length* are in multiples of this unit. @@ -518,17 +518,33 @@ self.set_transform(trans) return trans - def _angles(self, U, V, eps=0.001): + def _angles_lengths(self, U, V, eps=1): xy = self.ax.transData.transform(self.XY) uv = np.hstack((U[:,np.newaxis], V[:,np.newaxis])) xyp = self.ax.transData.transform(self.XY + eps * uv) dxy = xyp - xy - ang = np.arctan2(dxy[:,1], dxy[:,0]) - return ang + angles = np.arctan2(dxy[:,1], dxy[:,0]) + lengths = np.absolute(dxy[:,0] + dxy[:,1]*1j) / eps + return angles, lengths + + def _make_verts(self, U, V): uv = (U+V*1j) - a = np.absolute(uv) + if self.angles == 'xy' and self.scale_units == 'xy': + # Here eps is 1 so that if we get U, V by diffing + # the X, Y arrays, the vectors will connect the + # points, regardless of the axis scaling (including log). + angles, lengths = self._angles_lengths(U, V, eps=1) + elif self.angles == 'xy' or self.scale_units == 'xy': + # We could refine this by calculating eps based on + # the magnitude of U, V relative to that of X, Y, + # to ensure we are always making small shifts in X, Y. + angles, lengths = self._angles_lengths(U, V, eps=0.001) + if self.scale_units == 'xy': + a = lengths + else: + a = np.absolute(uv) if self.scale is None: sn = max(10, math.sqrt(self.N)) if self.Umask is not ma.nomask: @@ -543,14 +559,17 @@ self.scale = scale widthu_per_lenu = 1.0 else: - dx = self._dots_per_unit(self.scale_units) + if self.scale_units == 'xy': + dx = 1 + else: + dx = self._dots_per_unit(self.scale_units) widthu_per_lenu = dx/self._trans_scale if self.scale is None: self.scale = scale * widthu_per_lenu length = a * (widthu_per_lenu / (self.scale * self.width)) X, Y = self._h_arrows(length) if self.angles == 'xy': - theta = self._angles(U, V) + theta = angles elif self.angles == 'uv': theta = np.angle(uv) else: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |