I have been doing a self study on the 3D Logan Phantom developed by CG Koay and research group. A mathematica notebook from this group is available here. The codes present a 3D visualization of a slight variation of the original Shepp Logan data. While trying to make modifications to these codes according to my experiment, I discovered that the visualizations are the same no matter the intensity values I use. To explain what I am trying to do, I exported the Shepp Logan data used in the notebook and it is available here. In the last column (intensity values), my experiment produced a much smaller intensity values like between 0.000002 and -0.0000002. I made changes to the intensity column but the patterns and colours are just about the same with the data used by Koay. Therefore, I would be very grateful if anyone would kindly offer suggestions on (1) how I can have a visualization which is unique to the intensity values (2) having a coloured legend showing the magnitude of the intensity (possibly this will resolve most of the problem). Thank you!!
The colors are not determined by the intensity
but rather by the position of the function in the list of functions given as an argument to ParametricPlot3D
. To make the colors correspond to the intensity
(last column) use the option PlotStyle
Clear["Global`*"]
rotz[Ω_] := {{Cos[Ω], -Sin[Ω],
0}, {Sin[Ω], Cos[Ω], 0}, {0, 0, 1}}
rotx[Ω_] := {{1, 0, 0}, {0,
Cos[Ω], -Sin[Ω]}, {0, Sin[Ω],
Cos[Ω]}}
roty[Ω_] := {{Cos[Ω], 0,
Sin[Ω]}, {0, 1, 0}, {-Sin[Ω], 0,
Cos[Ω]}}
Note that Ellipsoid
is the name of a built-in function. User-defined functions should start with lower case letters to avoid naming conflicts with built-in names (now or in the future).
ellipsoid[{x0_, y0_, z0_, a_, b_, c_, ϕ_, θ_, ψ_, ρ_}][
tt_, pp_] := (rotz[ϕ].roty[θ].rotz[ψ]).{a Sin[tt] Cos[pp],
b Sin[tt] Sin[pp], c Cos[tt]} + {x0, y0, z0}
(* x0, y0, z0, a, b, c, ϕ, θ, ψ, ρ *)
ellipsoids =
{{0, 0, 0, 0.69, 0.92, 0.9, 0, 0, 0, 2.0},
{0, 0, 0, 0.6624, 0.874, 0.88, 0, 0, 0, -0.8},
{-0.22, 0.0, -0.25, 0.41, 0.16, 0.21, 3/5 Pi, 0, 0, -0.2},
{0.22, 0.0, -0.25, 0.31, 0.11, 0.22, 2/5 Pi, 0, 0, -0.2},
{0, 0.35, -0.25, 0.21, 0.25, 0.5, 0, 0, 0, 0.2},
{0, 0.1, -0.25, 0.0460, 0.0460, 0.0460, 0, 0, 0, 0.2},
{-0.08, -0.65, -0.25, 0.0460, 0.023, 0.02, 0, 0, 0, 0.1},
{0.06, -0.65, -0.25, 0.0460, 0.023, 0.02, 0, 0, 0, 0.1},
{0.06, -0.105, 0.625, 0.0560, 0.040, 0.1, Pi/2, 0, 0, 0.2},
{0.0, 0.1, 0.625, 0.0560, 0.056, 0.1, Pi/2, 0, 0, -0.2}};
The range of intensities is
{minInt, maxInt} = MinMax[ellipsoids[[All, -1]]]
(* {-0.8, 2.} *)
color
function to handle gradients specified by either strings (e.g., "TemperatureMap"
) or symbols (e.g., Hue
):
color[gradient_, intensity_?NumericQ] :=
If[StringQ[gradient], ColorData[gradient], gradient][
Rescale[intensity, {minInt, maxInt}]];
Use Manipulate
to select color gradients:
Manipulate[
g1 = ParametricPlot3D[
ellipsoid[#][tt, pp] & /@ ellipsoids[[3 ;; 10]] // Evaluate,
{tt, 0, Pi}, {pp, 0, 2 Pi},
Boxed -> False,
PlotPoints -> 50,
ViewPoint -> {0.25, -1.15, 0.75},
Axes -> False,
ImageSize -> 550,
PlotRange -> {{-1, 1}, {-1, 1}, {-1, 1}},
Mesh -> False,
PlotStyle -> (color[colorGradient, #] & /@
ellipsoids[[3 ;; 10, -1]])];
g2 = ParametricPlot3D[
ellipsoid[#][tt, pp] & /@ ellipsoids[[1 ;; 2]] // Evaluate,
{tt, Pi/2 + Pi/32, Pi}, {pp, 0, 2 Pi},
Boxed -> False,
PlotPoints -> 50,
ViewPoint -> {0.25, -1.15, 0.75},
Mesh -> False,
ImageSize -> 550,
PlotRange -> {{-1, 1}, {-1, 1}, {-1, 1}},
PlotStyle -> (color[colorGradient, #] & /@
ellipsoids[[1 ;; 2, -1]])];
Legended[
Legended[
Show[g1, g2],
Placed[
SwatchLegend[(color[colorGradient, #] & /@
ellipsoids[[All, -1]]),
Automatic],
{0.8, 0.5}]],
Placed[
BarLegend[{colorGradient, {minInt, maxInt}},
LegendLabel -> "Intensity"],
{0.9, 0.5}]],
{{colorGradient, Hue}, Join[{Hue, GrayLevel,
Blend[{{0, Red}, {.2, Yellow}, {.3, Green}, {1, Blue}}, #] &},
ColorData["Gradients"]]}]
However, changing the intensities won't change the colors if the relative intensities remain the same. The intensities used in the PlotStyle
are scaled to the range {0, 1}
for any range of intensities.
-
$\begingroup$ I really appreciate your kind contribution. It has been brilliant. I have been trying several colorData in the past days and I can confirm LightTemperatureMap still gave the best results. However, when I added a legend, some of the legend colors are almost the same since their intensity values are very close. I tried using "Hue" but the code gave me errors for obvious reasons. I like to ask you if there is a way I can work around this. I am not sure it will give a better legend but it would be nice to try this out. Thanks. $\endgroup$ – Dean Aug 8 '20 at 22:31
-
-
1
-
$\begingroup$ Yes! It is very beautifully done. I really appreciate this. I have been suffering on this task for more than five months. $\endgroup$ – Dean Aug 9 '20 at 17:14
-
1$\begingroup$
colorGradient
includes an option which is tailorable, i.e.,Blend[{{0, Red}, {.2, Yellow}, {.3, Green}, {1, Blue}}, #] &
. By adjusting the points at which the colors change you can make a nonlinear color scale. $\endgroup$ – Bob Hanlon Aug 27 '20 at 14:32
intensity
but rather by the position of the function in the list of functions given as an argument toParametricPlot3D
. $\endgroup$ – Bob Hanlon Aug 1 '20 at 19:24