Mathematica:动态菜单数

时间:2011-12-15 14:32:17

标签: dynamic menu wolfram-mathematica plot

我正在尝试在绘图中创建动态数量的下拉菜单,以绘制不同数量的曲线。 我有previously请求帮助来绘制这些数据,并且效果很好。

第一件事

Needs["PlotLegends`"]

以下是数据的示例(不是实际数字,因为它们太长了)。

data={{year, H, He, Li, C, O, Si, S},
{0, .5, .1, .01, 0.01, 0.01, 0.001, 0.001},
{100, .45, .1, .01, 0.01, 0.01, 0.001, 0.001},
{200, .40, .1, .01, 0.01, 0.01, 0.001, 0.001},
{300, .35, .1, .01, 0.01, 0.01, 0.001, 0.001}}

化合物变量是化合物的数量+ 1

compounds=8

目前,我的代码就是这个

Manipulate[
 ListLogLogPlot[
  {data[[All, {1, i}]],
   data[[All, {1, j}]],
   data[[All, {1, k}]]},
   PlotLegend -> {data[[1, i]],
                 data[[1, j]],
                 data[[1, k]]}
 ],
 {{i, 2, "Compound 1"},Thread[Range[2, compounds] -> Drop[data[[1]], 1]]},
 {{j, 3, "Compound 2"},Thread[Range[2, compounds] -> Drop[data[[1]], 1]]},
 {{k, 4, "Compound 2"},Thread[Range[2, compounds] -> Drop[data[[1]], 1]]},
 ContinuousAction -> False
 ]

Mathematica graphics

正如您所看到的,我可以通过复制3行(数据,图例和菜单描述符)中的每一行来轻松添加复合,但它很蹩脚且效率低下。绘制一个集合大约需要20秒,所以这里大约需要1分钟(我使用的是非常高效的集群)。

是否有添加一个小菜单或字段的解决方案,我可以在其中添加要绘制的化合物数量,因此会显示正确数量的菜单?我不需要超过7个地块,但效率......

数字 2,4,16 是要绘制的默认值。我可以使用默认值(2,14,16和我可能选择的其他一些)创建一个列表,或者它们都可以设置为2.

由于

3 个答案:

答案 0 :(得分:5)

你可以做这样的事情

Manipulate[
 ListLogLogPlot[data[[All, {1, #}]] & /@ i],
 {{n, 3, "# compounds"}, Range[7], 
  Dynamic[If[Length[i] != n, i = PadRight[{2, 4, 16}, n, 2]];
   PopupMenu[#, Range[7]]] &},
 {{i, {2, 4, 16}}, ControlType -> None},
 Dynamic[Column[
   Labeled[PopupMenu[Dynamic[i[[#]]], 
       Thread[Range[2, compounds] -> Drop[data[[1]], 1]]],
      Row[{"Compound ", #}], Left] & /@ Range[n]]
 ]
]

Mathematica graphics

如果没有PlotLegend,对于大约1000x1000个元素的随机数据集,这种运行速度非常快。如果我在PlotLegend中包含ListLogLogPlot选项,它会慢慢减速,这可能就是您的代码速度太慢的原因。

答案 1 :(得分:4)

如下:

Manipulate[
 Manipulate[ ListLogLogPlot[Table[Subscript[x, n], {n, 1, numCompounds}]],
  Evaluate@Apply[Sequence,Table[{{Subscript[x, n], n + 1, "Compound " <> ToString@n}, 
  Thread[Range[2, compounds] -> Drop[data[[1]], 1]]}, {n, 1, 
  numCompounds}]], ContinuousAction -> False],
 {{numCompounds, 3}, 1, compounds - 1, 1}]

Mathematica graphics

答案 2 :(得分:4)

我以为我会添加DM版本。如果你像我一样,你会发现比使用操作更容易。它本质上是Heike答案的DM版本。

DynamicModule[{data,compounds,n=1,c={2},labels},

  data=yourData;

  compounds=Length[data[[1]]];
  labels=Rule@@@Transpose[{Range[7],data[[1,2;;]]}];

  Column[{
    Dynamic[
      Grid[
        Join[
          {{"no. of compounds",PopupMenu[Dynamic[n],Range[7]]}},
          Table[
            With[{i=i},
              c=PadRight[c,n,2];
              {"compound"<>ToString[i], PopupMenu[Dynamic[c[[i]]],labels]}
            ],
            {i,n}
          ]
        ],
        Alignment->{{Right,Left},Center}
      ],
      TrackedSymbols:>{n}
    ], 
    Dynamic@ListLogLogPlot[data[[All,{1,#}]]&/@c]  
  }]
]

Mathematica graphics

我使用了Grid,因为它可以让您轻松地保持所有控制器及其标签对齐。如果更改n的值,PadRight[c,n,2]可让您保留当前设置。我会避免情节传说,总是自己制作。