With the help of the answer of the question Amelioration of a 3D plot, I have been able to construct the following plot
SetOptions[{Plot, ListPlot, ArrayPlot, ContourPlot, DiscretePlot3D,
Plot3D, Graph3D},
BaseStyle -> {14, Directive[FontFamily -> "Times New Roman"]}];
arrowAxes[arrowLength_] :=
Map[{Black, Arrow[Tube[{{0, 0, 0}, #}]]} &,
arrowLength IdentityMatrix[3]]
With[{zproj = -1.5},
Module[{f, surface, graphicsComplexPts, contourParts, contourProjPts,
projection}, f[x_, y_] := -(x^2 + y^2)^.2;
surface =
Plot3D[f[x, y], {x, -1, 1}, {y, -1, 1}, PlotRange -> {-1, 0},
ClippingStyle -> None, MeshFunctions -> {#3 &}, Mesh -> 15,
MeshStyle -> {Opacity[.5], Red, Thickness[.0075]}, Boxed -> False,
Axes -> False, PlotPoints -> 200,
PlotStyle -> {Opacity[0.5], Cyan}, Lighting -> "Neutral"];
(*Plot3D returns a Graphics3D object with a GraphicsComplex,
first element of which is a list of points*)
graphicsComplexPts = surface[[1, 1]];
(*Find Line heads within GraphicsComplex*)
contourParts = Position[surface, _Line];
(*using GraphicsComplex indexing,map to projected contours.*)
contourProjPts[k_] :=
graphicsComplexPts[[surface[[Sequence @@ contourParts[[k]],
1]]]] /. {x_, y_, z_} -> {x, y, zproj};
(*make projection with graphics primitives*)
projection =
Graphics3D[{Red,
Table[Line@contourProjPts[k], {k, 1, Length@contourParts}],
arrowAxes[.8]}];
Show[{surface, projection}, PlotRange -> {All, All, {zproj, 0.1}},
BoxRatios -> {1, 1, 1.4}]]]
But I have not been able to place correctly the origin where I want --- on the projected hyperplan ---, to have the same color for the background of the level set than for the surface, to put {x, y, z}
label on the axes and to downsize the tube and the arrowheads.