Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

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

enter image description here

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

A second working link for retrieving the data file is added.

share|improve this question
1  
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 –  belisarius Nov 14 '13 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! –  Vaggelis_Z Nov 14 '13 at 13:15
    
@belisarius Any particular reason why Mediafire is not a good choice?! So far, no problems encountered. –  Vaggelis_Z Nov 14 '13 at 13:16
1  
i.stack.imgur.com/p0adW.png –  belisarius Nov 14 '13 at 13:20
    
@belisarius Oops! Probably maintenance ... Any alternatives? Does StackExchange have its own repository for files? –  Vaggelis_Z Nov 14 '13 at 13:24

3 Answers 3

up vote 12 down vote accepted

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

Manipulate output

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} *)

Mathematica graphics

share|improve this answer
    
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. –  Vaggelis_Z Nov 15 '13 at 7:30
    
Many many thanks! –  Vaggelis_Z Nov 15 '13 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

Mathematica graphics

Cut graphics

Mathematica graphics

share|improve this answer
    
Poor decapitated Triceratops! Well, apparently your 3d surface is haul inside, while mine is not! –  Vaggelis_Z Nov 14 '13 at 15:25
    
Why don't you give a shot using my data? (use the second link) –  Vaggelis_Z Nov 14 '13 at 15:31
    
    
@belisarius Hey, leave me out of this, ok? –  rm -rf Nov 14 '13 at 15:53
    
@rm-rf A decapitated frog? That's quite an idea –  belisarius Nov 14 '13 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}]

Mathematica graphics

ClipRange was introduce in V9 for 3D images.

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

Mathematica graphics

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.