## matplotlib-users

 [Matplotlib-users] scaling arrows in quiver From: - 2009-09-30 01:28:39 ```A couple of us are trying to figure out how to scale arrows in a quiver plot so that we can exactly specify what the output arrows look like. For example, we'd like to scale the vectors to half of their size, and have it look like that on the quiver plot. So I tried even just getting a quiver plot to plot an arrow exactly as I passed it, without it scaling anything. My attempt is this: import matplotlib.pylab as plt fig=plt.figure(figsize=[6,6]) q=plt.quiver([0],[0],[1],[1],units='x',scale=1,angles='xy') ax=plt.axis([0,1.5,0,1.5]) plt.grid(True) plt.savefig('test.png') I'm trying to get the arrow to go from (0,0) to (1,1). However, with units='x', it's just short, and with units='y', it's just a bit too long. Furthermore, if I don't make the aspect ratio equal to one, I get wild results since the x-axis and y-axis are different units then. It would be really nice if there was a way to say units='data' (for data coordinates), and then if scale=1, the arrows would be drawn with the heads and tails at exactly the passed points. If scale=2, then each arrow would be drawn exactly half of its length. I realize that units='data' might mess up the other measurements of an arrow, though, so maybe another parameter is called for, like a scale_units, that defaults to units. What do people think? Thanks, Jason ```
 Re: [Matplotlib-users] scaling arrows in quiver From: Eric Firing - 2009-09-30 02:33:30 ```jason-sage@... wrote: > A couple of us are trying to figure out how to scale arrows in a quiver > plot so that we can exactly specify what the output arrows look like. > For example, we'd like to scale the vectors to half of their size, and > have it look like that on the quiver plot. > > So I tried even just getting a quiver plot to plot an arrow exactly as I > passed it, without it scaling anything. My attempt is this: > > import matplotlib.pylab as plt > fig=plt.figure(figsize=[6,6]) > q=plt.quiver([0],[0],[1],[1],units='x',scale=1,angles='xy') > ax=plt.axis([0,1.5,0,1.5]) > plt.grid(True) > plt.savefig('test.png') > > I'm trying to get the arrow to go from (0,0) to (1,1). However, with > units='x', it's just short, and with units='y', it's just a bit too > long. Furthermore, if I don't make the aspect ratio equal to one, I get > wild results since the x-axis and y-axis are different units then. It > would be really nice if there was a way to say units='data' (for data > coordinates), and then if scale=1, the arrows would be drawn with the > heads and tails at exactly the passed points. If scale=2, then each > arrow would be drawn exactly half of its length. I realize that > units='data' might mess up the other measurements of an arrow, though, > so maybe another parameter is called for, like a scale_units, that > defaults to units. This sounds like a good idea. The present situation does the originally intended autoscaling of arrows reasonably well, but it is very confusing when you need more control. A scale_units parameter could make it much easier to figure out how to manually set the scale. I will look into it. It might be trivial, it might not. Eric ```
 Re: [Matplotlib-users] scaling arrows in quiver From: Eric Firing - 2009-10-01 02:44:25 ```jason-sage@... wrote: > A couple of us are trying to figure out how to scale arrows in a quiver > plot so that we can exactly specify what the output arrows look like. > For example, we'd like to scale the vectors to half of their size, and > have it look like that on the quiver plot. > > So I tried even just getting a quiver plot to plot an arrow exactly as I > passed it, without it scaling anything. My attempt is this: > > import matplotlib.pylab as plt > fig=plt.figure(figsize=[6,6]) > q=plt.quiver([0],[0],[1],[1],units='x',scale=1,angles='xy') I have committed a change to svn trunk, so that if you change the above to q = plt.quiver([0],[0], [1], [1], scale_units='xy', angles='xy', scale=1) it should do exactly what you want. When scale_units is given, the setting of "units" controls only the specification of the arrow width, so if you are not specifying the width, it doesn't have any effect. If I could start from scratch, I probably could come up with a better set of kwarg names and defaults; but for reasons of backwards-compatibility, this is what we have. The new scale_units kwarg makes it much easier to manually set the scale. Previously (and still with the default of scale_units=None), it was almost hopelessly confusing. (Maybe I should add "width_units", identical to "units", and deprecate the latter; this might make the meanings of the kwargs clearer.) Eric > ax=plt.axis([0,1.5,0,1.5]) > plt.grid(True) > plt.savefig('test.png') > > I'm trying to get the arrow to go from (0,0) to (1,1). However, with > units='x', it's just short, and with units='y', it's just a bit too > long. Furthermore, if I don't make the aspect ratio equal to one, I get > wild results since the x-axis and y-axis are different units then. It > would be really nice if there was a way to say units='data' (for data > coordinates), and then if scale=1, the arrows would be drawn with the > heads and tails at exactly the passed points. If scale=2, then each > arrow would be drawn exactly half of its length. I realize that > units='data' might mess up the other measurements of an arrow, though, > so maybe another parameter is called for, like a scale_units, that > defaults to units. > > What do people think? > > Thanks, > > Jason > > > ------------------------------------------------------------------------------ > Come build with us! The BlackBerry® Developer Conference in SF, CA > is the only developer event you need to attend this year. Jumpstart your > developing skills, take BlackBerry mobile applications to market and stay > ahead of the curve. Join us from November 9-12, 2009. Register now! > http://p.sf.net/sfu/devconf > _______________________________________________ > Matplotlib-users mailing list > Matplotlib-users@... > https://lists.sourceforge.net/lists/listinfo/matplotlib-users ```
 Re: [Matplotlib-users] scaling arrows in quiver From: - 2009-10-01 04:05:27 ```Eric Firing wrote: > jason-sage@... wrote: >> A couple of us are trying to figure out how to scale arrows in a >> quiver plot so that we can exactly specify what the output arrows >> look like. For example, we'd like to scale the vectors to half of >> their size, and have it look like that on the quiver plot. >> >> So I tried even just getting a quiver plot to plot an arrow exactly >> as I passed it, without it scaling anything. My attempt is this: >> >> import matplotlib.pylab as plt >> fig=plt.figure(figsize=[6,6]) >> q=plt.quiver([0],[0],[1],[1],units='x',scale=1,angles='xy') > > I have committed a change to svn trunk, so that if you change the > above to > > q = plt.quiver([0],[0], [1], [1], scale_units='xy', angles='xy', scale=1) > > it should do exactly what you want. When scale_units is given, the > setting of "units" controls only the specification of the arrow width, > so if you are not specifying the width, it doesn't have any effect. > > If I could start from scratch, I probably could come up with a better > set of kwarg names and defaults; but for reasons of > backwards-compatibility, this is what we have. The new scale_units > kwarg makes it much easier to manually set the scale. Previously (and > still with the default of scale_units=None), it was almost hopelessly > confusing. > > (Maybe I should add "width_units", identical to "units", and deprecate > the latter; this might make the meanings of the kwargs clearer.) > Thanks! Jason ```
 Re: [Matplotlib-users] scaling arrows in quiver From: Christopher Barker - 2009-10-01 18:45:04 ```Eric Firing wrote: > I have committed a change to svn trunk, so that if you change the > above to > > q = plt.quiver([0],[0], [1], [1], scale_units='xy', angles='xy', scale=1) Eric, You might recall that I spent a bit of time making a "stick plot" with quiver. I go to work OK, but I couldn't do exactly what I wanted. I think gets closer, but I"m not sure it quite gets there: How exactly are the arrows scaled with scale_units='xy'? What I'd like is for the length of the arrow to the the y scale only -- the x scale it irrelevant (x is time, y is velocity). Can I do that with this? > (Maybe I should add "width_units", identical to "units", and deprecate > the latter; this might make the meanings of the kwargs clearer.) +1 But if you're doing that, you may want to make more changes, also -- you might as well do them all at once. -Chris -- Christopher Barker, Ph.D. Oceanographer Emergency Response Division NOAA/NOS/OR&R (206) 526-6959 voice 7600 Sand Point Way NE (206) 526-6329 fax Seattle, WA 98115 (206) 526-6317 main reception Chris.Barker@... ```
 Re: [Matplotlib-users] scaling arrows in quiver From: Eric Firing - 2009-10-02 01:17:59 ```Christopher Barker wrote: > Eric Firing wrote: >> I have committed a change to svn trunk, so that if you change the >> above to >> >> q = plt.quiver([0],[0], [1], [1], scale_units='xy', angles='xy', scale=1) > > Eric, > > You might recall that I spent a bit of time making a "stick plot" with > quiver. I go to work OK, but I couldn't do exactly what I wanted. I > think gets closer, but I"m not sure it quite gets there: > > How exactly are the arrows scaled with scale_units='xy'? What I'd like > is for the length of the arrow to the the y scale only -- the x scale it > irrelevant (x is time, y is velocity). Can I do that with this? Yes, use scale_units='y'. And I think you will want angles='uv' for this. This result was already available via units='y', but it was awkward to figure out the scale kwarg itself. The advantage now is that with scale_units='y', and scale=1, an arrow with sqrt(u^2+v^2)==1 will be 1 y-unit long. Eric > >> (Maybe I should add "width_units", identical to "units", and deprecate >> the latter; this might make the meanings of the kwargs clearer.) > > +1 > > But if you're doing that, you may want to make more changes, also -- you > might as well do them all at once. > > -Chris > ```