I was trying to adapt Jens's answer for adding arrows to a 3D graphics into a general plotting function here. But I find that when I try to combine the Graphics3D object with the Plot3D it makes the arrows ugly when the x, y, and z axes have different length scales. Essentially, the Plot3D will always have a BoxRatio near to {1 ± 0.5, 1 ± 0.5, 1 ± 0.5}
lengths1 = {2, 2, .1};
lengths2 = {2, 2, 2};
lengths3 = {2, 2, 100};
arrowfunc[
lengths_] := {RGBColor @@ #, Arrow[Tube[{{0, 0, 0}, #}]]} & /@
DiagonalMatrix[lengths];
Graphics3D[arrowfunc@#, BoxRatios -> {1, 1, 1}] & /@ {lengths1,
lengths2, lengths3}
Is there any way to modify arrowfunc to make these all look basically identical? I've tried adding Arrowheads with a Scaled size, but it didn't work; likewise adding a Scaled radius to the Tube function.




Blue), and including theViewAngledirective in the lastShow, rather than in thearrowaxisfunc, i.e.Show[plot, arrows,ViewAngle -> 35 Degree]within yourthreeDArrowPlot2. Not perfect by any means, but maybe slightly better. Try also addingAppearance -> "Projected"within theArrowheads[]directive, i.e.Arrowheads[Large, Appearance -> "Projected"]. – MarcoB Dec 09 '15 at 16:04