ARROW3  MESSES  UP  MY  PLOTS!
A Dialog Between a Reasonable User and an Arrow3 Apologist

Reasonable User:  Why should I use Arrow3 when there are many other solutions on the File Exchange, most notably Erik Johnson's Arrow.m?

Arrow3 Apologist:  Arrow.m is an excellent tool for labeling because it draws two-dimensional patches in a plane.  Arrow3.m, on the other hand, draws cones and spheres in 3-space.  The programmer says it draws an "astonishing" number of vectors with a "bewildering" variety of colors in "practically no time at all," and that it "looks real pretty when you twirl 'em around."

Reasonable User:  That is not what I want to do.

Arrow3 Apologist:  Oh, OK.  Sorry.

Reasonable User:  I want to use Arrow3 to indicate the path of a particle that moves along the helix in fig. 1.

t=0:pi/40:8*pi;
plot3(20*t,cos(t),sin(t))
axis([0,600,-1.5,1.5,-1.5,1.5])
grid on, view(35,40)

Figure 1.
Figure 1.

Arrow3 Apologist:  Well OK, but it's gonna mess up your plot because you didn't fix the aspect ratio.

t=0:pi/40:8*pi;
plot3(20*t,cos(t),sin(t))
axis([0,600,-1.5,1.5,-1.5,1.5])
grid on, view(35,40)
hold on
arrow3([0,0,0],[600,0,0],'',2,[],0)
hold off

Figure 2.
Figure 2.

Reasonable User:  Fig. 2 does not look anything like fig. 1.

Arrow3 Apologist:  Sure it does ... sort of.  Arrow3 is graphically similar to the coneplot function:  only with a fixed aspect ratio can the surfaces be properly rendered.  Arrow3 overrides stretch-to-fill behavior by setting DataAspectRatioMode, PlotBoxAspectRatioMode, and CameraViewAngleMode to manual.  You can restore stretch-to-fill scaling with axis normal, but that will warp the surfaces.

t=0:pi/40:8*pi;
plot3(20*t,cos(t),sin(t))
axis([0,600,-1.5,1.5,-1.5,1.5])
grid on, view(35,40)
hold on
arrow3([0,0,0],[600,0,0],'',2,[],0)
hold off
axis normal

Figure 3.
Figure 3.

Reasonable User:  Now the arrowhead and origin marker are distorted.

Arrow3 Apologist:  Yep, they're squished.  If you set pbaspect and change view, you can get a plot with a manual aspect ratio that fills the plot box in much the same fashion as fig. 1.

t=0:pi/40:8*pi;
plot3(20*t,cos(t),sin(t))
axis([0,600,-1.5,1.5,-1.5,1.5])
grid on, view(35,25)
hold on
pbaspect([1.8,1.4,1])
% similar results may be obtained by using
% daspect([111,0.7,1])
arrow3([0,0,0],[600,0,0],'',1.25,[],0)
hold off

Figure 4.
Figure 4.

Reasonable User:  Why doesn't the program accommodate stretch-to-fill scaling automatically?

Arrow3 Apologist:  I asked the programmer, and he said that the stretch-to-fill thing is "really hard" and "awfully complicated."  Personally, I think he just can't figure it out.

Reasonable User:  Alright, but what I really wanted was low-impact coordinate axes with dark blue little arrows at quarter pi increments along the helix.

Arrow3 Apologist:  Oh, OK.  Sorry.

t=(0:pi/40:8*pi)'; u=cos(t); v=sin(t);
plot3(20*t,u,v)
axis([0,600,-1.5,1.5,-1.5,1.5])
grid on, view(35,25)
hold on
pbaspect([1.8,1.4,1])
arrow3(zeros(3),diag([500,1.5,1.5]),'l',0.7,[],0)
p=[20*t,u,v]; ndx=11:10:length(t);
p2=p(ndx,:); p1=p(ndx-3,:);
arrow3(p1,p2,'0_b',0.7)
hold off

Figure 5.
Figure 5.


See also Example 16.