# How to make a density plot on Ellipsoid[] surface?

Suppose I have the ellipsoid below and a set of points that I know rest on its boundary, which we can visualize:

myEllipsoid = Ellipsoid[{0.0, 0.0, 0.0}, {0.6, 0.51, 0.51}];
myPts = {{0.593679, -0.0735365, 0.00659148}, {0.494143, 0.283443,
0.0578081}, {0.584258, 0.0654221, 0.0958602}, {0.402426, 0.310281,
0.216377}, {0.459941, 0.281123, 0.168012}, {-0.504438, 0.252776,
0.111169}, {0.559942, -0.0130326, -0.182759}, {0.300967, \
-0.0211969, -0.440688}, {-0.317913, -0.0273509,
0.431659}, {-0.338246, -0.420491, -0.0250135}, {0.520373, -0.251189,
0.0368769}, {0.548404, -0.127346, -0.163074}, {0.564902, 0.145276,
0.0918395}, {0.53703, -0.0377495,
0.224289}, {-0.368742, -0.366963, -0.164922}, {0.0502806, \
-0.220897, -0.457688}, {0.594841, -0.0394563, -0.0538189}, {0.544155,
0.0648616, 0.204835}, {0.157706,
0.0313612, -0.491067}, {0.572797, -0.140541,
0.0574317}, {0.535294, -0.223203, -0.0570592}, {0.459515, -0.25623, \
-0.204665}, {0.581355, 0.0300194, 0.122529}, {0.585535,
0.0628569, -0.0918634}, {0.0200364, -0.140076, -0.490091}, \
{0.520035, -0.243296, -0.0742746}, {0.539101,
0.182186, -0.130109}, {0.48967, 0.0613401,
0.288269}, {0.402467, -0.246313,
0.287054}, {0.575742, -0.14353, -0.00233433}, {0.511062, -0.253598, \
-0.0841572}, {0.350632, 0.383596, 0.155332}, {0.499918,
0.274937, -0.0628012}, {0.384362, -0.365614, 0.140316}, {-0.59223,
0.0754093, -0.0317296}, {0.573891, 0.141038,
0.0474573}, {0.570195, -0.145204, -0.0641499}, {0.300396,
0.0924771, -0.431684}, {0.591402, -0.0852871, -0.0112781}, \
{-0.507293, 0.145422, 0.230261}, {0.0928641,
0.390652, -0.318215}, {0.382672, 0.328638,
0.215165}, {0.450786, -0.301918,
0.148754}, {0.532054, -0.0794074, -0.221965}, {0.173024, -0.108262,
0.476182}, {0.551047, -0.0709817, -0.188871}, {0.591256, -0.0824216,
0.0270596}, {0.597563, 0.0240085, -0.0391397}, {-0.584905,
0.0726007, -0.0874755}, {0.583177, 0.11959,
0.00889368}, {-0.523774, -0.240517, -0.0635752}, {0.580437, \
-0.128582, -0.0122874}, {0.569432, 0.0891909, 0.133687}, {0.49999,
0.277453, -0.0500251}, {0.565507, 0.081353, 0.149758}, {-0.206338,
0.458657, 0.137744}, {-0.464875, -0.15932, -0.280318}, {0.434456,
0.132814, -0.32571}, {0.516675, -0.216816,
0.142186}, {0.423751, -0.111787, -0.34332}, {0.588299,
0.0199414, -0.098227}, {0.582378, -0.044564,
0.114317}, {0.548397, -0.0643825, -0.196648}, {0.559008,
0.0549179, -0.176947}, {0.312693, -0.0343426, 0.433909}, {0.308635,
0.321725, 0.296261}, {0.375231,
0.333513, -0.217122}, {0.360862, -0.132396, 0.385339}, {0.531232,
0.20298, 0.122493}, {0.512777, 0.261849,
0.0395054}, {0.512189, -0.163328, -0.209488}, {0.107448, -0.242647, \
-0.439182}, {0.515151, -0.0724695, 0.251218}, {0.569021, 0.153872,
0.0498918}, {0.45504, 0.332394, 0.00350962}, {0.53832,
0.0293732, -0.223304}, {0.580887, 0.103948, -0.0741727}, {0.539406,
0.0339783, -0.220744}, {0.304372, 0.437276, -0.0442191}, {0.592431,
0.0324502, -0.0739451}, {0.533067, -0.194056, -0.130905}, \
{0.571904, -0.136919, 0.0710108}, {0.545131,
0.212543, -0.0149038}, {0.553351, -0.167445, -0.10409}, {0.592384,
0.0683956, 0.0433925}, {0.551983, 0.0480098, -0.194062}, {0.56086,
0.0928923, -0.155558}, {0.490714, 0.290722, 0.040035}, {0.536577,
0.0172276,
0.227562}, {0.536115, -0.225522, -0.0397386}, {0.105799, -0.0686488,
0.497293}, {0.179106, 0.0270204, 0.485997}, {0.480118, -0.174415,
0.251264}, {0.527599, -0.237323, -0.0515979}, {0.34209,
0.382726, -0.170498}, {0.178285, -0.46368,
0.148781}, {0.592031, -0.0366386, -0.0743019}, {0.581949, -0.118243,
0.0378657}, {0.598141, 0.0397553,
0.00537969}, {0.557574, -0.0584943, 0.179056}, {0.181338,
0.343732, -0.343788}, {0.550845, -0.19825, -0.0396088}, {0.0298082,
0.0786698, 0.503258}, {0.4384, 0.0438016, 0.345429}, {0.512319,
0.249786, 0.0898446}, {0.411013, 0.178582,
0.325815}, {0.449884, -0.336882, 0.0194843}, {0.21589, 0.307635,
0.363024}, {0.535883, -0.169128, -0.154968}, {0.398095,
0.156826, -0.347856}, {0.408139, -0.211333, -0.30836}, {0.0708964,
0.222115, 0.455119}, {0.0577863, -0.267084, -0.431687}, {0.463168,
0.323315, 0.0239453}, {-0.584824, 0.0581806, 0.0980116}, {0.536894,
0.227047, 0.0168769}, {0.43428, -0.351209,
0.0221204}, {0.497472, -0.282963,
0.0350587}, {0.456874, -0.0267252, -0.329508}, {0.188642,
0.10691, -0.472186}, {0.29668, 0.148713, -0.417601}, {0.585931,
0.107533, -0.0221711}, {0.139081, 0.297389, 0.397095}, {0.55664,
0.0822179, -0.171682}, {0.571576, -0.126264, -0.0900977}, {0.566408,
0.0722321, -0.151959}, {-0.541625, -0.0842809, -0.202597}, \
{0.581613,
0.0266587, -0.122419}, {-0.213295, -0.467568, -0.0927895}, {0.2543,
0.417563, 0.197531}, {0.572915, 0.145749, 0.0413487}, {0.471502,
0.207719, 0.237341}, {0.526441, -0.0578416, 0.237741}, {0.572783,
0.0448353, -0.145092}, {0.503646, 0.0660191,
0.269208}, {0.566383, -0.127961,
0.10934}, {0.507364, -0.0627867, -0.264902}, {0.597244,
0.0430006, -0.0231319}, {0.587094, -0.0908935,
0.0529867}, {0.500906, -0.269482, 0.0787378}, {0.411024, 0.058188,
0.366953}, {0.548466, 0.178768, -0.103937}, {0.57667, -0.138372,
0.0262143}, {0.431806, 0.24059, -0.259811}, {0.562194, 0.170577,
0.0514626}, {0.59487, -0.0569283, -0.0344614}, {0.1424, 0.49073,
0.0680694}, {0.374084, -0.240519,
0.318032}, {0.570799, -0.131581, -0.0859541}, {0.076717, -0.0164623,
0.505546}, {0.584972, -0.0919421,
0.0664315}, {0.476142, -0.0776265, 0.300458}, {0.551125, 0.159802,
0.122931}, {-0.558464, 0.185316, -0.0205674}, {0.0642329, -0.261885,
0.434206}, {0.54552, -0.206754, -0.0483986}, {0.5614,
0.172301, -0.0519852}, {0.358392, -0.258641, -0.316864}, {0.365779, \
-0.219937, -0.339207}, {0.597374, -0.0337621, 0.0336373}, {0.564885,
0.113641, -0.128994}, {0.308195, -0.437552, 0.00475064}, {0.579782,
0.130226, -0.0165808}, {-0.459815, -0.0768046, -0.318501}, \
{0.511888, -0.036747, -0.263502}, {0.532026, -0.210161, -0.1069}, \
{0.330123, -0.422443, 0.0538807}, {0.582555, 0.0288666,
0.118623}, {0.117622, -0.481487, 0.135185}, {0.529074,
0.051752, -0.234905}, {0.480519, -0.0912771, -0.291452}, {0.578019, \
-0.0848916, -0.107249}, {0.512038, 0.247668, -0.0966111}, {-0.522405,
0.159365, -0.19372}, {0.0116164, -0.462754, -0.214153}, {0.563395,
0.151171, 0.0889709}, {-0.580684, 0.0660721, 0.110053}, {0.573207,
0.129883, 0.0764261}, {0.563379, 0.163965,
0.0624212}, {0.592263, -0.0517964, 0.0631042}, {0.532889,
0.225255, -0.0647384}, {0.499886,
0.2646, -0.0976922}, {0.589578, -0.0758341, -0.0566247}, {0.5865, \
-0.107561, 0.0018891}, {0.25802, 0.0803959, 0.453361}, {0.483384,
0.266277, -0.142749}, {0.548632, 0.153649, 0.137919}, {0.563278,
0.168678, -0.0491019}, {0.347009, 0.114294, 0.400046}, {0.181869,
0.407917, -0.264208}, {0.52543, -0.241474, 0.0482152}, {0.439454,
0.278003, -0.208052}, {0.529985, 0.0429061, 0.235203}, {0.578855,
0.100313, -0.0891473}, {0.569105, -0.141127, -0.0786077}, \
{0.586202, -0.108403, 0.00862628}, {0.268968, 0.289547,
0.352128}, {0.430088, -0.134101, 0.329351}, {0.582217,
0.114561, -0.0454432}, {0.012659, -0.504316, 0.0751613}};


Now, I would like to color the surface of the ellipsoid so that it represents the local density of points on its surface (a density plot). I'm aware of this question but I didn't see a way to apply this to my specific region.

One quite inefficient way I was attempting relies on first making a mesh out of the ellipsoid, then extracting each polygon, then counting how many points are near each polygon within a given (small) distance. However, this takes a while to compute for the real scenarios I'm trying, and also there is no guarantee of avoiding double counting points that are within a distance from adjacent polygons. Still I leave here some code to see the idea. Also there might be a faster way to compute distances (say, not sampling all points but only these within some radius of the polygon query, etc).

(*Brute force, not avoiding double counting approach*)
{myVertex, myPolygons} = {MeshCoordinates[myDiscreteEllipsoid],
MeshCells[myDiscreteEllipsoid, 2]};
explicitPolygons =
Table[myVertex[[myPolygons[[i]][[1]]]], {i, 1, Length[myPolygons]}];


(*List of points within reach of each polygon*)
distanceThreshold = 0.01;

myPointsWithinReach =
Table[Flatten[
Position[(RegionDistance[Polygon[explicitPolygons[[i]]], #] & /@
myPts), _?(# <= distanceThreshold &)]],
{i, 1, Length[explicitPolygons]}];


Then the idea would be to re-color the polygons with their associated "density" of points.

I'm aware of ParametricPlot3D[], but I'm working with a few different shapes besides ellipsoids, so I'd like to avoid this function.

Note: I'll be working with thousands of points in different configurations (different sized ellipsoids, and other shapes). So, a good solution should account for the need to use thousands of points.

This is not exactly what the OP is asking for, i.e. a true ellipsoidal smooth density histogram, but perhaps it gives satisfactory results and can inspire more answers.

The idea is to construct a full 3D-space kernel-distribution function and plot its density plot on the ellipsoid surface. Note this generalizes nicely to arbitrary surfaces and should be reasonably performant:

kernel = SmoothKernelDistribution[myPts];
pdf = PDF[kernel];

SliceDensityPlot3D[pdf[{x, y, z}], myEllipsoid,
{x, -0.6, 0.6}, {y, -0.6, 0.6}, {z, -0.6, 0.6},
ColorFunction -> "SunsetColors", BoxRatios -> Automatic]


• Seems promising, but the colors seem odd on the surface (like jagged), even when many points are added (which seems weird given that more points should make things smoother, I imagine). I wonder if this has to do with the kernel/pdf generation. EDIT: Yeah, I can smooth things within the kernel. Well, this is a great start, thanks! Jul 12, 2022 at 20:48
• You could pre-discretize the ellipse to get the smoother image like: SliceDensityPlot3D[pdf[{x, y, z}], BoundaryDiscretizeRegion[myEllipsoid, AccuracyGoal -> 4], {x, -0.6, 0.6}, {y, -0.6, 0.6}, {z, -0.6, 0.6}, ColorFunction -> "SunsetColors", BoxRatios -> Automatic] Jul 14, 2022 at 16:39