Global Index (short | long) | Local contents | Local Index (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