3

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).

enter image description here

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.

u17
  • 601
  • 3
  • 8

2 Answers2

3

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}}]}]]

enter image description here

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]]

enter image description here

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}]]

enter image description here

kglr
  • 394,356
  • 18
  • 477
  • 896
2

You can use the useful-but-undocumented function Charting`get3DPlotRange 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} = Charting`get3DPlotRange @ plot;
Show[plot,
    Graphics3D[
        {
            EdgeForm @ Blue,
            FaceForm @ Opacity @ 0.05, (* set to 0 for transparent *)
            Cuboid @@ Thread[{x, y, {0, 0}}]
        }
    ]
] 

enter image description here

Jason B.
  • 68,381
  • 3
  • 139
  • 286
  • Thanks! I ran into trouble when using this together with PlotLegends -> Placed[]. – u17 Nov 28 '18 at 20:16