Skip to main content

plotting - SliceContourPlot3D combinations with Manipulate


I am trying to visualize 4D data, 3 space and one time, i.e., f(x,y,z,t). Using SliceContourPlot3D looks like one of the best options. And I did the following and it works fine.


h[x_, y_, z_, t_] := Sin[x] Cos[y] Sin[z] Exp[t];


Manipulate[
SliceContourPlot3D[
h[x, y, z,
t], {{"XStackedPlanes", {i}}, {"YStackedPlanes", {j}},
{"ZStackedPlanes", {k}}}, {x, 0, 5}, {y, 0,
10}, {z, 0, 15}, ColorFunction -> "TemperatureMap",
PerformanceGoal -> "Quality",
AxesLabel -> {Style["x", 13, Blue], Style["y", 13, Blue],
Style["z", 13, Blue]}], {{t, 0, Style["Time", 12, Blue]}, 0, 10,

1, Appearance -> "Labeled"}, {{i, 0,
Style["zy plane position", 12, Blue]}, 0, 5, 1,
Appearance -> "Labeled"}, {{j, 0,
Style["zx plane position", 12, Blue]}, 0, 10, 1,
Appearance -> "Labeled"}, {{k, 0,
Style["xy plane position", 12, Blue]}, 0, 15, 1,
Appearance -> "Labeled"}, ContinuousAction -> False]

enter image description here


But I would like to able to give an option to visualize only one (xy or zy or zx) or only two planes (xy and zy ..). I tried nested Manipulate to have a toggle bar it didn't work. I tried the following and it is not working. I also realized that the nested if statements are not elegant. Any suggestions?



Panel[Framed[Module[{xyzPlanes = {1, 2}}, Column[{
Row[{Style["Planes of Interest ", 14, Blue, Editable -> False],
TogglerBar[
Dynamic[xyzPlanes], {1 -> "xy-Plane", 2 -> " yz-Plane",
3 -> "xz-Plane"}]}],
Row[{
Res =
If[
MemberQ[xyzPlanes, 1] == True &&
MemberQ[xyzPlanes, 2] == False &&

MemberQ[xyzPlanes, 3] == False,
Manipulate[
SliceContourPlot3D[
h[x, y, z, t], {"XStackedPlanes", {i}}, {x, 0, 10}, {y, 0,
10}, {z, 0, 10}, PerformanceGoal -> "Quality",
AxesLabel -> {Style["x", 13, Blue], Style["y", 13, Blue],
Style["z", 13, Blue]}], {{t, 0, Style["Time", 12, Blue]},
0, 10, 1,
Appearance -> "Labeled"}, {{i, 0,
Style["zy plane position", 12, Blue]}, 0, 10, 1,

Appearance -> "Labeled"}, ContinuousAction -> False],
If[
MemberQ[xyzPlanes, 1] == False &&
MemberQ[xyzPlanes, 2] == True &&
MemberQ[xyzPlanes, 3] == False,

Manipulate[
SliceContourPlot3D[
h[x, y, z, t], {"YStackedPlanes", {j}}, {x, 0, 10}, {y, 0,
10}, {z, 0, 10}, PerformanceGoal -> "Quality", ,

AxesLabel -> {Style["x", 13, Blue], Style["y", 13, Blue],
Style["z", 13, Blue]}], {{t, 0,
Style["Time", 12, Blue]}, 0, 10, 1,
Appearance -> "Labeled"}, {{j, 0,
Style["y plane position", 12, Blue]}, 0, 10, 1,
Appearance -> "Labeled"}, ContinuousAction -> False],

MemberQ[xyzPlanes, 1] == True &&
MemberQ[xyzPlanes, 2] == True &&
MemberQ[xyzPlanes, 3] == False,

Manipulate[

SliceContourPlot3D[
h[x, y, z,
t], {{"XStackedPlanes", {i}}, {"YStackedPlanes", {j}}, \
{"ZStackedPlanes", {k}}}, {x, 0, 5}, {y, 0, 10}, {z, 0, 15},
ColorFunction -> "TemperatureMap",
PerformanceGoal -> "Quality",
AxesLabel -> {Style["x", 13, Blue], Style["y", 13, Blue],
Style["z", 13, Blue]}], {{t, 0,

Style["Time", 12, Blue]}, 0, 10, 1,
Appearance -> "Labeled"}, {{i, 0,
Style["zy plane position", 12, Blue]}, 0, 5, 1,
Appearance -> "Labeled"}, {{j, 0,
Style["zx plane position", 12, Blue]}, 0, 10, 1,
Appearance -> "Labeled"}, ContinuousAction -> False]

]]}],
Row[{Style[" ", 12, Red],
InputField[Dynamic[Res], FieldSize -> {50, 35}]}, Spacer[15]]



}]]], Background -> Lighter[Gray, .6]]

Answer



Manipulate[SliceContourPlot3D[h[x, y, z, t], 
planes /. {{} | "XStackedPlanes" -> {"XStackedPlanes", {i}},
"YStackedPlanes" -> {"YStackedPlanes", {j}},
"ZStackedPlanes" -> {"ZStackedPlanes", {k}}},
{x, 0, 5}, {y, 0, 10}, {z, 0, 15},
ColorFunction -> "TemperatureMap", PerformanceGoal -> "Quality",

AxesLabel -> {Style["x", 13, Blue], Style["y", 13, Blue], Style["z", 13, Blue]}],
{{planes, "XStackedPlanes", Style["planes", 12, Blue]},
{"XStackedPlanes", "YStackedPlanes", "ZStackedPlanes"}, TogglerBar},
{{t, 0, Style["Time", 12, Blue]}, 0, 10, 1, Appearance -> "Labeled"},
{{i, 0, Style["zy plane position", 12, Blue]}, 0, 5, 1,
Appearance -> "Labeled", Enabled -> MemberQ[planes, "XStackedPlanes"]},
{{j, 0, Style["zx plane position", 12, Blue]}, 0, 10, 1,
Appearance -> "Labeled", Enabled -> MemberQ[planes, "YStackedPlanes"]},
{{k, 0, Style["xy plane position", 12, Blue]}, 0, 15, 1,
Appearance -> "Labeled", Enabled -> MemberQ[planes, "ZStackedPlanes"]},

ContinuousAction -> False]

enter image description here


Comments

Popular posts from this blog

plotting - How to draw lines between specified dots on ListPlot?

I would like to create a plot where I have unconnected dots and some connected. So far, I have figured out how to draw the dots. My code is the following: ListPlot[{{1, 1}, {2, 2}, {3, 3}, {4, 4}, {1, 4}, {2, 5}, {3, 6}, {4, 7}, {1, 7}, {2, 8}, {3, 9}, {4, 10}, {1, 10}, {2, 11}, {3, 12}, {4,13}, {2.5, 7}}, Ticks -> {{1, 2, 3, 4}, None}, AxesStyle -> Thin, TicksStyle -> Directive[Black, Bold, 12], Mesh -> Full] I have thought using ListLinePlot command, but I don't know how to specify to the command to draw only selected lines between the dots. Do have any suggestions/hints on how to do that? Thank you. Answer One possibility would be to use Epilog with Line : ListPlot[ {{1, 1}, {2, 2}, {3, 3}, {4, 4}, {1, 4}, {2, 5}, {3, 6}, {4, 7}, {1, 7}, {2, 8}, {3, 9}, {4, 10}, {1, 10}, {2, 11}, {3, 12}, {4, 13}, {2.5, 7}}, Ticks -> {{1, 2, 3, 4}, None}, AxesStyle -> Thin, TicksStyle -> Directive[Black, Bold, 12], Mesh -> Full, Epilog -> { Line[ ...

dynamic - How can I make a clickable ArrayPlot that returns input?

I would like to create a dynamic ArrayPlot so that the rectangles, when clicked, provide the input. Can I use ArrayPlot for this? Or is there something else I should have to use? Answer ArrayPlot is much more than just a simple array like Grid : it represents a ranged 2D dataset, and its visualization can be finetuned by options like DataReversed and DataRange . These features make it quite complicated to reproduce the same layout and order with Grid . Here I offer AnnotatedArrayPlot which comes in handy when your dataset is more than just a flat 2D array. The dynamic interface allows highlighting individual cells and possibly interacting with them. AnnotatedArrayPlot works the same way as ArrayPlot and accepts the same options plus Enabled , HighlightCoordinates , HighlightStyle and HighlightElementFunction . data = {{Missing["HasSomeMoreData"], GrayLevel[ 1], {RGBColor[0, 1, 1], RGBColor[0, 0, 1], GrayLevel[1]}, RGBColor[0, 1, 0]}, {GrayLevel[0], GrayLevel...

list manipulation - Selecting multiple columns from a matrix?

Sample data: data = { {{2013, 1, 1}, 24.13, 167.67, 231.82}, {{2013, 1, 2}, 32.15, 170.92, 225.99}, {{2013, 1, 3}, 35.43, 172.68, 221.67}, {{2013, 1, 4}, 36.73, 173.05, 218.32}, {{2013, 1, 5}, 58.19, 165.96, 197.05}, {{2013, 1, 6}, 69.99, 163.50, 187.52}, {{2013, 1, 7}, 71.37, 154.21, 175.58}, {{2013, 1, 8}, 72.51, 149.66, 163.25}}; I want a DateListPlot with three graphs, so for a matrix formed by columns 1 and 2, one for columns 1 and 3, and 1 for columns 1 and 4. At the moment I'm using this code: data2 = Transpose[{data[[All, 1]], data[[All, 2]]}]; data3 = Transpose[{data[[All, 1]], data[[All, 3]]}]; data4 = Transpose[{data[[All, 1]], data[[All, 4]]}]; DateListPlot[{data2, data3, data4}, Joined -> True, Filling -> {3 -> {1}}] but I have a hunch that this can be done more efficiently. I don't like the Transpose s in particular. Any ideas? edit (for extra credit) What if I need to multiply the second column by 2, which in my solution is simp...