recently i've generated a 3d plot, where I colored the points by the distance from the center. My question is, that is it possible to add the values associated with the colors as a legend?

An example code is the following:

ClearAll["Global`*"]
pointsChar = {{0.`, 0.`, 41.63`}, {8.50479382206883`, 0.`, 
   31.74032265185878`}, {14.975`, 0.`, 
   25.937460843343935`}, {19.69999492385721`, 0.`, 
   19.69999492385721`}, {23.053596248741755`, 0.`, 
   13.31`}, {25.12373074177866`, 0.`, 6.731883363116563`}, {26.16`, 
   0.`, 0.`}, {26.205567667222418`, 
   0.`, -7.0217606936313866`}, {24.595121467478055`, 
   0.`, -14.2`}, {21.630396436496486`, 
   0.`, -21.630396436496486`}, {16.62`, 
   0.`, -28.786684421794742`}, {10.396761041768258`, 
   0.`, -38.80124044203187`}}

ListPointPlot3D[pointsChar, 
 ColorFunction -> Function[{x, y, z}, Hue[Sqrt[x^2 + y^2 + z^2]]], 
 Filling -> Axis, BoxRatios -> {1, 1, 1}, 
 PlotStyle -> PointSize[Large]]
  • 2
    You can generate your legend using BarLegend[{Hue,MinMax[EuclideanDistance[{0,0,0},#]&/@pointsChar]}]. – N.J.Evans Nov 16 at 17:25
  • Legended[ YYYYY , XXXX ] where YYYY your plot function as is and XXXX the legend code from @N.J. Evans, separated by a comma. I was happening to be working on the same problem but I could not match the colours with the legend. Maybe a complete answer can be posted by the first commentator...? – Titus Nov 16 at 17:52
up vote 1 down vote accepted
ClearAll["Global`*"]
pointsChar = {{0.`, 0.`, 41.63`}, {8.50479382206883`, 0.`, 
    31.74032265185878`}, {14.975`, 0.`, 
    25.937460843343935`}, {19.69999492385721`, 0.`, 
    19.69999492385721`}, {23.053596248741755`, 0.`, 
    13.31`}, {25.12373074177866`, 0.`, 6.731883363116563`}, {26.16`, 0.`, 
    0.`}, {26.205567667222418`, 
    0.`, -7.0217606936313866`}, {24.595121467478055`, 
    0.`, -14.2`}, {21.630396436496486`, 0.`, -21.630396436496486`}, {16.62`, 
    0.`, -28.786684421794742`}, {10.396761041768258`, 
    0.`, -38.80124044203187`}};

{minDist, maxDist} = MinMax[EuclideanDistance[{0, 0, 0}, #] & /@ pointsChar];

Since colors given by Hue are the same for min and max values, an alternative color function may be desired. Further, the EuclideanDistance is given in the Tooltip.

Manipulate[
 Legended[
  ListPointPlot3D[
   Tooltip[#, EuclideanDistance[{0, 0, 0}, #]] & /@
    pointsChar,
   ColorFunction -> 
    Function[{x, y, z}, 
     If[cf === Hue, Hue, ColorData[cf]][
      Rescale[Sqrt[x^2 + y^2 + z^2], {minDist, maxDist}]]],
   ColorFunctionScaling -> False,
   Filling -> Axis,
   BoxRatios -> {1, 1, 1},
   PlotStyle -> PointSize[Large]],
  BarLegend[{If[cf === Hue, Hue, 
     ColorData[cf][Rescale[#, {minDist, maxDist}]] &], {minDist, maxDist}}]],
 {{cf, Hue, "ColorFunction"}, {Hue, "Rainbow", "TemperatureMap"}}]

enter image description here

You can extract the Point primitives and their styles from ListPointPlot3D output and use them to construct a PointLegend:

lpp = ListPointPlot3D[pointsChar, 
   ColorFunction -> Function[{x, y, z}, Hue[Sqrt[x^2 + y^2 + z^2]]], 
   Filling -> Axis, BoxRatios -> {1, 1, 1}, 
   PlotStyle -> PointSize[Large]];
legend = PointLegend[## & @@ Transpose[Cases[lpp, {a_, Point[b_]} :> {a, b}, ∞]], 
  LegendMarkerSize -> 20];

Legended[lpp, legend]

enter image description here

Your Answer

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

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