Search code examples
wolfram-mathematicamathematica-8

How to plot a 3d graph starting from a set of points as a ground XY base


This question might seem a little strange but for my purposes is not that crazy. Its easy but I need you to follow me.

The aim

My aim is plotting a tridimensional graph.

The problem

The problem is the material I have in my hands to start building this graph. Actually I have a collection of points in the 2D space (thus tuples of two real ordered values). Consider a moment to have these collection of points stored into an array and now consider to plot them on a 2D diagram. You will just have a nice sparse view of these points.

Well, the second step is this: consider the surface with these points and create a third axis orthogonal to the plane where those points are drawn. The aim is assigning to every point a numerical scalar value (using a function that accepts the couple and returns a numerical value). So the graph should show bars starting from every point and having a specific value according to the assignment function.

How can I achieve this in Mathematica?

A little note

Basically my points in the 2d space are also connected by a graph. Is it possible to connect the top of the bars to the top of other bars whose base point are connected together in the 2d graph?

Some other notes

My graph doesn`t have to be a surface but just a collection of bars placed on a plane in the exact place where the correspondent point they refer to is located. But if you have a good hint how to draw a surface other than bars, it will be gladly accepted.

I hope I was clear. I would like to point that I have Mathematica 8 so all functionalities are available. Thank you.


Solution

  • This can be done using Graphics3D primitives. Lets start with some data

    (* a list of 2D coordinates *)
    points2D = RandomReal[{0, Pi}, {50, 2}];
    
    (* some edges as a list of pairs of vertex indices *)
    edges = Union[Flatten[MapIndexed[Sort /@ Thread[{#2[[1]], 
         Nearest[points2D -> Automatic, #, 4]}] &, points2D], 1]];
    
    (* constructing list of 3D coordinates *)
    f[{x_, y_}] := 2 + Sin[x y]
    points3D = {##, f[{##}]} & @@@ points2D;
    

    The actual plot can then be constructed as follows (width is half the width of the bars)

    With[{width = .02},
      Graphics3D[{{LightBlue, EdgeForm[None],
        Cuboid[{#1, #2, 0} - width {1, 1, 0}, {##} + width {1, 1, 0}] & @@@ points3D},
       {Orange,
        GraphicsComplex[points3D, Line[edges]]}}, 
      Lighting -> "Neutral", 
      BoxRatios -> {1, 1, .6}]]
    

    Mathematica graphics