# how to limit arrow length in 3D quiver plot?

38 views (last 30 days)
A on 5 Apr 2012
I have a vector field with a large dynamic range; I would like to set a high threshold on vector magnitudes being displayed.
logarithmic scale would also help.

A on 14 May 2012
here is what works:
Ln = sqrt(U.^2 + V.^2 +W.^2);
Maxlen=100;
U(Ln>Maxlen)=U(Ln>Maxlen)./Ln(Ln>Maxlen).*Maxlen;
V(Ln>Maxlen)=V(Ln>Maxlen)./Ln(Ln>Maxlen).*Maxlen;
W(Ln>Maxlen)=W(Ln>Maxlen)./Ln(Ln>Maxlen).*Maxlen;
quiver3(X,Y,Z,U,V,W)

Sean de Wolski on 5 Apr 2012
Couldn't you just takle the log or log10 f the u/v/w components?
2-d example:
[xx yy] = meshgrid(1:5);
u = (rand(5)+1).^(rand(5)*10);
v = (rand(5)+1).^(rand(5)*10);
quiver(xx(:),yy(:),log10(u(:)),log10(v(:)))
More per comments Let's not give up on this yet!
[xx yy] = meshgrid(1:5);
u = (rand(5)+1).^(rand(5)*10)*sign(randn(5));
v = (rand(5)+1).^(rand(5)*10)*sign(randn(5));
quiver(xx(:),yy(:),sign(u(:)).*log10(abs(u(:))),sign(u(:)).*log10(abs(v(:))))

A on 5 Apr 2012
components could be negative; log would not work
Sean de Wolski on 5 Apr 2012

Matt Kindig on 5 Apr 2012
For your situation, I would specify the length of the arrows directly, rather than letting Matlab perform the Auto-scaling of the vectors. This would allow you to specify upper bounds on the lengths, log scaling, or whatever else you prefer. Something like this:
% X,Y,Z are the origins of your vectors
% U,V,W are the directions of your vectors
Ln = sqrt(U.^2 + V.^2 +W.^2);
U = U./Ln; V = V./Ln; W = W./Ln; %normalize vectors
Maxlen = 100; %set this based on your preference
U = U*Maxlen; %this will set 'Maxlen' as the max length
V = V*Maxlen;
W = W*Maxlen;
%or for log scaling,
U = Maxlen*log(U); %or similar
V = Maxlen*log(V);
U =
hq = quiver3( X, Y, Z,