# How to visualize the interior of a complicated 3D plot

I have an external data file (can be downloaded here: link 1 or link 2) which contains a dense grid of initial condition in the (x,y,z) space. I read it with Mathematica and plot these initial conditions with different colors according to some specific properties

m = Import["data_3d.out", "Table"];

getColor[m_List, i_Integer] :=
Module[{s = m[[i, 6]]},
Which[s == 0, Black, s == 1, Red, s == 2, Darker[Green], s == 3,
Brown, s == 4, Blue, s == 5, Orange, s == 6, Cyan, s == 7,
Magenta, s == 8, Yellow, True, White]];

data = Table[{PointSize[0.004], getColor[m, i],
Point[{m[[i, 1]], m[[i, 2]], m[[i, 3]]}]}, {i, 1, Length[m]}];

P0 = Graphics3D[data, Axes -> True, BoxRatios -> {1, 1, 1},
PlotRange -> 6, ImageSize -> 550]


and here is the output

We observe, that several color patterns appear but we can see only the surface of the three-dimensional grid. So, the question:

Is there a way to penetrate inside the 3d surface and visualize how these color patterns are? Any suggestions?

Please, us the original data file for testing. I think, generating simpler but random 3d grids in this case, could be very illusive since all the story is about the color patterns that appear and obviously cannot be replicated randomly.

EDIT

• Mediafire isn't a good choice for sharing info. Anyway, your request about using your datafile doesn't sound right. Since you're asking for " a way to penetrate inside the 3d surface", any 3D point set will do as an example Nov 14, 2013 at 13:10
• @belisarius But any 3D point set does not have the properties of my datafile. The purpose is to find a way to visualize the color patterns inside the surface however these patterns are not random! Nov 14, 2013 at 13:15
• @belisarius Any particular reason why Mediafire is not a good choice?! So far, no problems encountered. Nov 14, 2013 at 13:16
• i.stack.imgur.com/p0adW.png Nov 14, 2013 at 13:20
• @belisarius Oops! Probably maintenance ... Any alternatives? Does StackExchange have its own repository for files? Nov 14, 2013 at 13:24

A tomographic approach:

m = Import["http://www.datafilehost.com/get.php?file=3c69e895", "Data"];

getColor[s_List] :=
Replace[s, {0 -> Black, 1 -> Red, 2 -> Darker[Green], 3 -> Brown,
4 -> Blue, 5 -> Orange, 6 -> Cyan, 7 -> Magenta,
8 -> Yellow, _ -> White}, 1];

nfx = Nearest[m[[All, 1]] -> m];

Manipulate[
Graphics3D[{PointSize[0.004],
Point[#[[All, 1 ;; 3]], VertexColors -> getColor[#[[All, 6]]]] &@ nfx[x0]},
Axes -> True, BoxRatios -> {1, 1, 1}, PlotRange -> 6, ImageSize -> 350],
{x0, Min[m[[All, 1]]], Max[m[[All, 1]]]}
]


Other ways of slicing:

nfy = Nearest[m[[All, 2]] -> m];
nfz = Nearest[m[[All, 3]] -> m];


In response to a comment, here is a static approach:

xlist = Range[0, 5, 1]

Graphics3D[{PointSize[0.004],
Point[#[[All, 1 ;; 3]], VertexColors -> getColor[#[[All, 6]]]] &@
Flatten[nfx /@ xlist, 1]}, Axes -> True, BoxRatios -> {1, 1, 1},
PlotRange -> 6, ImageSize -> 350]

(* {0, 1, 2, 3, 4, 5} *)


• Amazing!!! Is it possible to include inside the 3d space several slices, let's say for x = {0,1,2,3,4,5}? No manipulation, just a static graphic for several slices. Nov 15, 2013 at 7:30
• Many many thanks! Nov 15, 2013 at 12:40

One easy, although not beautiful way relies on the properties of 3D graphics. When you look how the simulated camera works, then you see that only the volume between near- and farplane is rendered. If you put your near plane in the distance, everything which is too close is cut.

In Mathematica this can be be adjusted using the ViewRange option of Graphics3D. Here is a small example:

data = ExampleData[{"Geometry3D", "Triceratops"}, "VertexData"];
With[{gr =
Graphics3D[{{Hue[#3], Sphere[{##}, .2]} & @@@ data},
SphericalRegion -> True]},
Manipulate[
Show[gr, ViewPoint -> {0, -1, .5},
ViewRange -> {nearPlane, farPlane}],
{nearPlane, 4, 10},
{{farPlane, 15}, 5, 15}
]
]


Full graphics

Cut graphics

• Poor decapitated Triceratops! Well, apparently your 3d surface is haul inside, while mine is not! Nov 14, 2013 at 15:25
• Why don't you give a shot using my data? (use the second link) Nov 14, 2013 at 15:31
• No animal were harmed in the making of this answer Nov 14, 2013 at 15:37
• @belisarius Hey, leave me out of this, ok?
– rm -rf
Nov 14, 2013 at 15:53
• @rm-rf A decapitated frog? That's quite an idea Nov 14, 2013 at 16:48

There are couple other ways to visualize 3D images, one of which is new in V10. (Note: The links to the original data are no longer valid.)

The new features, ClipPlanes and IntervalSlider, are useful here. Something like this was demonstrated at WTC 2014.

knee = Raster3D[
RawArray["Byte",
ImageData[ExampleData[{"TestImage3D", "MRknee"}], "Byte"]],
{{-1, 1, 1}, {1, -1, -1}}, {0, 255},
ColorFunction -> "GrayLevelOpacity"];

Manipulate[
Graphics3D[knee,
ClipPlanes -> {{0, 1, 0, -y[[1]]}, {0, -1, 0, y[[2]]}},
Axes -> True],
{{y, {-1, 1}}, -1, 1, IntervalSlider}]


ClipRange was introduce in V9 for 3D images.

Image3D[ExampleData[{"TestImage3D", "MRknee"}], ClipRange -> {All, {0, 60}, All}]