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 am trying to make surface plots of squashed spheres. The spheres are defined by a list of points. For simplicity, consider the round sphere:

pts = Flatten[
   Table[{Sin[θ] Cos[ϕ], Sin[θ] Sin[ϕ], 
     Cos[θ]}, {θ, 0, π, π/14}, {ϕ, 0, 
     2 π, 2 π/14}], 1];

One way to plot this is

ListPlot3D[pts,-pts,BoundaryStyle -> None,ColorFunction -> "Rainbow",InterpolationOrder 
-> 2]

ListPlot3D has the nice feature that it interpolates the data to make a smooth surface. However, the northern and southern hemispheres are shaded differently, so there is a clear break at the equator:

enter image description here

An alternative is to do

ListSurfacePlot3D[pts]

Now the shading is uniform (there is no break at the equator). However, the data is no longer interpolated (and interpolation is not an option for ListSurfacePlot3D), so the surface looks rough and lumpy:

enter image description here

I am trying to find a solution that combines the best of both world: the smooth surface of ListPlot3D with the uniform shading of ListSurfacePlot3D.
Any suggestions? Thanks!

share|improve this question
    
Are you asking how to fit an ellipsoid to a set of data points? Have you tried Sphere[]? How are the data points really generated? –  Jens Aug 30 at 19:13
2  
The actual data points I am interested in are not a sphere or an ellipsoid. The true surface has spherical topology (and a z -> -z symmetry), but can be an otherwise arbitrary shape. The data points are generated by a different program and then fed into mathematica. I just generated this simple sphere for illustrative purposes. –  idj Aug 30 at 19:58
1  
The InterpolationOrder in ListPlot3D is a red herring; the appearance of the plot does not change if you change the order to $1$. Mathematica does not support higher-order interpolation on unstructured data yet. The reason it still looks like a smooth surface is because the shading is being interpolated when the surface is rendered. –  Rahul Narain Aug 30 at 20:56

2 Answers 2

up vote 6 down vote accepted

From the example using ListPlot3D, I assume that your data points can be described by a height function above the plane. In other words, they describe a convex shape with reflection symmetry at the z=0 plane.

Then the only thing you may have to modify is the lighting and the ratio of the axes for your 3D plot, to get a smoother appearance with uniform color as is stated in the question:

pts = Flatten[
   Table[{Sin[θ] Cos[ϕ], Sin[θ] Sin[ϕ], 
     Cos[θ]}, {θ, 0, Pi, Pi/14}, {ϕ, 0, 
     2 Pi, 2 Pi/14}], 1];

ListPlot3D[{pts, -pts}, BoundaryStyle -> None, 
 ColorFunction -> (Orange &), InterpolationOrder -> 2, 
 BoxRatios -> Automatic, 
 Lighting -> {{"Directional", White, {3, 0, 0}}, {"Ambient", 
    LightGray}}]

sphere

I put the directional light source in a position that illuminates both halves of the sphere equally, so that the equatorial "crease" doesn't show up (no matter how you rotate the output).

share|improve this answer
    
Perfect, thanks so much! (I also appreciate belisarius's suggestion but at least for my data sets it introduced artifacts at the poles, whereas this solution gives a perfectly smooth result.) –  idj Aug 31 at 7:37

Just format your list such that SphericalPlot3D[] can handle it:

pts = Flatten[Table[{Theta, Phi, Cos[Theta]}, {Theta, 0, Pi, Pi/14}, {Phi, 0, 2 Pi, 2 Pi/14}], 1];
f = Interpolation[pts];
SphericalPlot3D[f[Theta, Phi], {Theta, 0, Pi}, {Phi, 0, 2 Pi}, ColorFunction -> "Rainbow", 
                Mesh -> None]

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.