5
$\begingroup$

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]]
$\endgroup$
2
  • 2
    $\begingroup$ You can generate your legend using BarLegend[{Hue,MinMax[EuclideanDistance[{0,0,0},#]&/@pointsChar]}]. $\endgroup$
    – N.J.Evans
    Commented Nov 16, 2018 at 17:25
  • $\begingroup$ 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...? $\endgroup$
    – Titus
    Commented Nov 16, 2018 at 17:52

2 Answers 2

2
$\begingroup$
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

$\endgroup$
8
$\begingroup$

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

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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