Skip to main content

gui construction - How can I get "custom" controls to appear and behave like "default" controls in my Manipulate?



For various reasons I need to define some controls in my Manipulate with complex behaviors that are not (or at least I don't think can be) accomplished using the simple default syntax for Manipulate controls.


Thanks to some answers here, I have controls that support thee behaviors, but



  • I can't get them to appear in my Manipulate aligned and labeled like the default controls, and

  • one of the controls does not update its displayed value when I click on it.


For example with


Manipulate[
Row@start,
{{r2, "q", "R2"}, {"p", "m", "q", "y", "z"}, ControlType -> SetterBar, Appearance -> "Palette"},

{{r3, "z", "Label R3"}, {"p", "m", "q", "y", "z"}, ControlType -> SetterBar, Appearance -> "Palette"},

{{r4, "-"}, ControlType -> None},
Row[{
SetterBar[
Dynamic[r4, If[# != "-", n = 4; start = Take[Join[start, {"A"}], n], n = 3; start = Take[start, n]] &],
{"\[Beta]", "\[Gamma]", "-"},
Appearance -> "Palette"]
}],


Column[{Dynamic[pop /@ Range[n] // Row, TrackedSymbols :> {n}]}], {x,None}, {n, None}, {start, None},

Initialization :> (pop[i_] := With[{j = i}, PopupMenu[Dynamic[start[[j]]], CharacterRange["A", "Z"], ImageSize -> {45, 19}]]; start = ConstantArray["A", 3]; n = 3;)

]

I get



in which




  • the controls for r4 and the popup menus lack labels and do not align with the other (default style) controls, and

  • the r4 control does not reflect changes in the value of the variable.


How can I get these "custom" controls to appear and behave correctly in my Manipulate?




If there's a solution that uses "default" Manipulate control specification that I'm missing, that would be great, as would a solution that allows me to specify define and reuse a custom control (I have several that are similar to the popup control in that they involve several popups).



Answer



I do not understand everything the code is suppose to do, but passing the control as a pure function inside a variable declaration might give the desired behavior. The other change is the variable-setting function in the Dynamic for r4 was changed to actually set the value of r4 upon an update.


Manipulate[
Row@start,

{{r2, "q", "R2"}, {"p", "m", "q", "y", "z"},
ControlType -> SetterBar, Appearance -> "Palette"},
{{r3, "z", "Label R3"}, {"p", "m", "q", "y", "z"},
ControlType -> SetterBar, Appearance -> "Palette"},
{{r4, "-"},
Row[{SetterBar[
Dynamic[r4,
If[(r4 = #) != "-", n = 4; start = Take[Join[start, {"A"}], n],
n = 3; start = Take[start, n]] &], {"\[Beta]", "\[Gamma]",
"-"}, Appearance -> "Palette"]}] &},

{n, Column[{Dynamic[pop /@ Range[n] // Row,
TrackedSymbols :> {n}]}] &},
{x, None}, {start, None},
Initialization :> (pop[i_] :=
With[{j = i},
PopupMenu[Dynamic[start[[j]]], CharacterRange["A", "Z"],
ImageSize -> {45, 19}]]; start = ConstantArray["A", 3]; n = 3;)]

Comments

Popular posts from this blog

plotting - Plot 4D data with color as 4th dimension

I have a list of 4D data (x position, y position, amplitude, wavelength). I want to plot x, y, and amplitude on a 3D plot and have the color of the points correspond to the wavelength. I have seen many examples using functions to define color but my wavelength cannot be expressed by an analytic function. Is there a simple way to do this? Answer Here a another possible way to visualize 4D data: data = Flatten[Table[{x, y, x^2 + y^2, Sin[x - y]}, {x, -Pi, Pi,Pi/10}, {y,-Pi,Pi, Pi/10}], 1]; You can use the function Point along with VertexColors . Now the points are places using the first three elements and the color is determined by the fourth. In this case I used Hue, but you can use whatever you prefer. Graphics3D[ Point[data[[All, 1 ;; 3]], VertexColors -> Hue /@ data[[All, 4]]], Axes -> True, BoxRatios -> {1, 1, 1/GoldenRatio}]

plotting - Filling between two spheres in SphericalPlot3D

Manipulate[ SphericalPlot3D[{1, 2 - n}, {θ, 0, Pi}, {ϕ, 0, 1.5 Pi}, Mesh -> None, PlotPoints -> 15, PlotRange -> {-2.2, 2.2}], {n, 0, 1}] I cant' seem to be able to make a filling between two spheres. I've already tried the obvious Filling -> {1 -> {2}} but Mathematica doesn't seem to like that option. Is there any easy way around this or ... Answer There is no built-in filling in SphericalPlot3D . One option is to use ParametricPlot3D to draw the surfaces between the two shells: Manipulate[ Show[SphericalPlot3D[{1, 2 - n}, {θ, 0, Pi}, {ϕ, 0, 1.5 Pi}, PlotPoints -> 15, PlotRange -> {-2.2, 2.2}], ParametricPlot3D[{ r {Sin[t] Cos[1.5 Pi], Sin[t] Sin[1.5 Pi], Cos[t]}, r {Sin[t] Cos[0 Pi], Sin[t] Sin[0 Pi], Cos[t]}}, {r, 1, 2 - n}, {t, 0, Pi}, PlotStyle -> Yellow, Mesh -> {2, 15}]], {n, 0, 1}]

plotting - Mathematica: 3D plot based on combined 2D graphs

I have several sigmoidal fits to 3 different datasets, with mean fit predictions plus the 95% confidence limits (not symmetrical around the mean) and the actual data. I would now like to show these different 2D plots projected in 3D as in but then using proper perspective. In the link here they give some solutions to combine the plots using isometric perspective, but I would like to use proper 3 point perspective. Any thoughts? Also any way to show the mean points per time point for each series plus or minus the standard error on the mean would be cool too, either using points+vertical bars, or using spheres plus tubes. Below are some test data and the fit function I am using. Note that I am working on a logit(proportion) scale and that the final vertical scale is Log10(percentage). (* some test data *) data = Table[Null, {i, 4}]; data[[1]] = {{1, -5.8}, {2, -5.4}, {3, -0.8}, {4, -0.2}, {5, 4.6}, {1, -6.4}, {2, -5.6}, {3, -0.7}, {4, 0.04}, {5, 1.0}, {1, -6.8}, {2, -4.7}, {3, -1....