# Show additional box border in 3D plot

How to best draw an additional box boder at {x, y, 0} as indicated by the red arrow below? PlotRange is Automatic (do not assume it is {{0, 100}, {0, 100}, {-50, 50}} always).

points = RandomReal[100, {100, 3}];
points[[All, 3]] = points[[All, 3]] - 50;
ListPointPlot3D[points, BoxRatios -> 1]


The only idea I have is extracting PlotRange with AbsoluteOptions and drawing the box border manually. That may be too difficult for me. I use Mathematica 9.

You can use InfinitePlane without having to get the PlotRange of input plot:

Show[ListPointPlot3D[points, BoxRatios -> 1],
Graphics3D[{Opacity[0], EdgeForm[{Blue, Thick}],
InfinitePlane[{{0, 0, 0}, {0, 1, 0}, {1, 1, 0}}]}]]


Update: An alternative that also works in version 9 is to use FaceGrids:

facegrids = {#, {{}, {0}}} & /@ Join[#, -#] &@Most[IdentityMatrix[3]];
ListPointPlot3D[points, BoxRatios -> 1, FaceGrids -> facegrids,
FaceGridsStyle -> Directive[Thick, Blue]]


Update 2: You can also use PlotRange to extract the plot range of a plot object and use it with Cuboid:

lpp = ListPointPlot3D[points, BoxRatios -> 1];
rectangle = Transpose[Append[PlotRange[lpp][[;; 2]], {0, 0}]];
Show[lpp, Graphics3D[{Opacity[0], EdgeForm[{Thick, Blue}], Cuboid @@ rectangle}]]


• Something like this I was hoping for, thanks. Unfortunately InfinitePlane was only introduced in MMA 10.
– st12
Nov 28, 2018 at 19:42
• @Frank, please see the update.
– kglr
Nov 28, 2018 at 20:01
• That's truly fantastic.
– st12
Nov 28, 2018 at 20:15

You can use the useful-but-undocumented function Chartingget3DPlotRange to find the plot range, and use that to make your box:

points = RandomReal[{-50, 50}, {100, 3}];
plot = ListPointPlot3D[points, BoxRatios -> 1];
{x, y, z} = Chartingget3DPlotRange @ plot;
Show[plot,
Graphics3D[
{
EdgeForm @ Blue,
FaceForm @ Opacity @ 0.05, (* set to 0 for transparent *)
Cuboid @@ Thread[{x, y, {0, 0}}]
}
]
]


• Thanks! I ran into trouble when using this together with PlotLegends -> Placed[].
– st12
Nov 28, 2018 at 20:16