threeDArrowPlot[func_, var1_, var2_, tubesize_List: {.05, .05, .05}, headsize_List: {.05, .05, .05}, plotopts : OptionsPattern[]] := Module[{plot, arrows, lengths}, plot = Plot3D[func, var1, var2, Boxed -> False, AxesOrigin -> {0, 0, 0}, Evaluate[FilterRules[{plotopts}, Options[Plot3D]]]]; lengths = DiagonalMatrix[(Charting`get3DPlotRange@plot)[[All, 2]] // Flatten]; arrows = Table[{RGBColor @@ lengths[[n]], Arrowheads[headsize[[n]]], Arrow[Tube[{{0, 0, 0}, lengths[[n]]}, tubesize[[n]]]]}, {n, 3}]; Show[plot, Graphics3D@arrows] ];