Global Index (all files) (short | long) | Local Index (files in subdir) (short | long)
[hh, a, b, c] = quiver(varargin)
QUIVER_LAB Quiver plot. This has been rewritten, so the proper command is quiver_lab(...). The only difference is that it places a small strip with no data at the bottom of the figure. There are a few new outputs too, so the proper command is: [h, a, b, c] = quiver_lab(...) To plot a scale arrow at the bottom left of the screen, execute the following command: plot(a(:,[1 3]), a(:,[2 4])); The variable 'b' gives the limits on the plotting frame. So, modify your axis so it reads: axis([FRAME(1:2) b(3) FRAME(4)]) instead of axis(FRAME) The variable 'c' is the size of the arrow, in relative (c(1)) and absolute (c(2)) magnitude. You can tag a label on to the end of the arrow by executing the following command: text(a(1, 1), a(1, 2), num2str(c(2))) But, that looks kind of shabby, and it might be better to mess around with rescaling stuff first. I'll leave that up to the user. The input parameters are the same as QUIVER, and are listed below (try 'vi quiver_lab.m' if you want to see them, or 'help quiver').
| This function calls | This function is called by |
|---|---|
function [hh, a, b, c] = quiver(varargin)
% Rewritten 12 March, 1999
%
% QUIVER(X,Y,U,V) plots velocity vectors as arrows with components (u,v)
% at the points (x,y). The matrices X,Y,U,V must all be the same size
% and contain corresponding position and vecocity components (X and Y
% can also be vectors to specify a uniform grid). QUIVER automatically
% scales the arrows to fit within the grid.
%
% QUIVER(U,V) plots velocity vectors at equally spaced points in
% the x-y plane.
%
% QUIVER(U,V,S) or QUIVER(X,Y,U,V,S) automatically scales the
% arrows to fit within the grid and then stretches them by S. Use
% S=0 to plot the arrows without the automatic scaling.
%
% QUIVER(...,LINESPEC) uses the plot linestyle specified for
% the velocity vectors. Any marker in LINESPEC is drawn at the base
% instead of an arrow on the tip. Use a marker of '.' to specify
% no marker at all. See PLOT for other possibilities.
%
% QUIVER(...,'filled') fills any markers specified.
%
% H = QUIVER(...) returns a vector of line handles.
%
% Example:
% [x,y] = meshgrid(-2:.2:2,-1:.15:1);
% z = x .* exp(-x.^2 - y.^2); [px,py] = gradient(z,.2,.15);
% contour(x,y,z), hold on
% quiver(x,y,px,py), hold off, axis image
%
% See also FEATHER, QUIVER3, PLOT.
% Clay M. Thompson 3-3-94
% Copyright (c) 1984-98 by The MathWorks, Inc.
% $Revision: 5.15 $ $Date: 1997/11/21 23:46:38 $
% Arrow head parameters
alpha = 0.33; % Size of arrow head relative to the length of the vector
beta = 0.33; % Width of the base of the arrow head relative to the length
autoscale = 1; % Autoscale if ~= 0 then scale by this.
plotarrows = 1; % Plot arrows
sym = '';
filled = 0;
ls = '-';
ms = '';
col = '';
nin = nargin;
% Parse the string inputs
while isstr(varargin{nin}),
vv = varargin{nin};
if ~isempty(vv) & strcmp(lower(vv(1)),'f')
filled = 1;
nin = nin-1;
else
[l,c,m,msg] = colstyle(vv);
if ~isempty(msg),
error(sprintf('Unknown option "%s".',vv));
end
if ~isempty(l), ls = l; end
if ~isempty(c), col = c; end
if ~isempty(m), ms = m; plotarrows = 0; end
if isequal(m,'.'), ms = ''; end % Don't plot '.'
nin = nin-1;
end
end
error(nargchk(2,5,nin));
% Check numeric input arguments
if nin<4, % quiver(u,v) or quiver(u,v,s)
[msg,x,y,u,v] = xyzchk(varargin{1:2});
else
[msg,x,y,u,v] = xyzchk(varargin{1:4});
end
if ~isempty(msg), error(msg); end
if nin==3 | nin==5, % quiver(u,v,s) or quiver(x,y,u,v,s)
autoscale = varargin{nin};
end
% Scalar expand u,v
if prod(size(u))==1, u = u(ones(size(x))); end
if prod(size(v))==1, v = v(ones(size(u))); end
% autoscale < 0 ==> set this length of the vector to 0.9 grid boxes
if autoscale < 0;
use_units = 1;
autoscale = -1* autoscale;
else
use_units = 0;
end
if autoscale,
% Base autoscale value on average spacing in the x and y
% directions. Estimate number of points in each direction as
% either the size of the input arrays or the effective square
% spacing if x and y are vectors.
if min(size(x))==1, n=sqrt(prod(size(x))); m=n; else [m,n]=size(x); end
delx = diff([min(x(:)) max(x(:))])/n;
dely = diff([min(y(:)) max(y(:))])/m;
len = sqrt((u.^2 + v.^2)/(delx.^2 + dely.^2));
if use_units
tema1 = autoscale;
autoscale = 1.8 / (autoscale ./ sqrt((delx.^2 + dely.^2)));
else
autoscale = autoscale*0.9 / max(len(:));
end
u = u*autoscale; v = v*autoscale;
% Extend this so a small vector can be drawn at the bottom of the screen
if nargout > 1
if use_units;
a1 = [-1*autoscale 1] * tema1;
else
a1 = [-1 1/autoscale] * max(sqrt(u(:).^2 + v(:).^2));
end
u = [NaN*ones(2,n); u];
v = [NaN*ones(2,n); v];
x = [NaN*ones(2,n); x];
y = [NaN*ones(2,n); y];
if n >= 4
% Define lat and lon to extend the bottom of the figure a bit
offset = n-ceil(n/2)-1;
x(2, offset) = [x(3,offset)];
y(2, offset) = [y(3,offset) - 1.6*dely];
y(1, offset) = y(3,offset) - 2.4*dely;
% Get shaft
global FRAME
temx = mean(FRAME(1:2)) - a1(1)/2;
temy = y(2, offset);
% a = [x(2,offset) x(2,offset)+a1(1) NaN NaN; ...
% y(2,offset) y(2,offset) NaN NaN; ]';
a = [temx temx+a1(1) NaN NaN; ...
temy temy NaN NaN; ]';
% Get arrowhead
% a = [a [ ...
% x(2,offset)+a1(1)-alpha*(a1(1)+beta*eps); x(2,offset)+a1(1); ...
% x(2,offset)+a1(1)-alpha*(a1(1)-beta*eps); NaN] [...
% y(2,offset)+alpha*beta*(a1(1)+eps); y(2, offset); ...
% y(2,offset)-alpha*beta*(a1(1)+eps); NaN] ];
a = [a [ ...
temx+a1(1)-alpha*(a1(1)+beta*eps); temx+a1(1); ...
temx+a1(1)-alpha*(a1(1)-beta*eps); NaN] [...
temy+alpha*beta*(a1(1)+eps); temy; ...
temy-alpha*beta*(a1(1)+eps); NaN] ];
b = [min(x(:)) max(x(:)) min(y(:)) max(y(:))];
c = a1;
else
disp('n < 4, so no arrow drawn. You can change this if you want');
end
end
end
ax = newplot;
next = lower(get(ax,'NextPlot'));
hold_state = ishold;
% Make velocity vectors
u = u(:).'; v = v(:).';
kp = sort(intersect(find(~isnan(u)), find(~isnan(v))));
x = x(:).'; y = y(:).';
u = u(kp); v = v(kp);
x = x(kp); y = y(kp);
uu = [x;x+u;repmat(NaN,size(u))];
vv = [y;y+v;repmat(NaN,size(u))];
h1 = plot(uu(:),vv(:),[col ls]);
if plotarrows,
% Make arrow heads and plot them
hu = [x+u-alpha*(u+beta*(v+eps));x+u; ...
x+u-alpha*(u-beta*(v+eps));repmat(NaN,size(u))];
hv = [y+v-alpha*(v-beta*(u+eps));y+v; ...
y+v-alpha*(v+beta*(u+eps));repmat(NaN,size(v))];
hold on
h2 = plot(hu(:),hv(:),[col ls]);
else
h2 = [];
end
if ~isempty(ms), % Plot marker on base
hu = x; hv = y;
hold on
h3 = plot(hu(:),hv(:),[col ms]);
if filled, set(h3,'markerfacecolor',get(h1,'color')); end
else
h3 = [];
end
if ~hold_state, hold off, view(2); set(ax,'NextPlot',next); end
if nargout>0, hh = [h1;h2;h3]; end