Mathematica:动态菜单数

A p*_*doc 3 plot wolfram-mathematica menu dynamic

我试图在绘图中创建一个动态数量的下拉菜单,以绘制不同数量的曲线.我之前已经请求帮助绘制这些数据,并且效果很好.

第一件事

Needs["PlotLegends`"]
Run Code Online (Sandbox Code Playgroud)

这是一个数据示例(不是实际数字,因为它们太长了).

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}}
Run Code Online (Sandbox Code Playgroud)

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

compounds=8
Run Code Online (Sandbox Code Playgroud)

现在,我的代码就是这个

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
 ]
Run Code Online (Sandbox Code Playgroud)

Mathematica图形

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

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

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

谢谢

Hei*_*ike 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]]
 ]
]
Run Code Online (Sandbox Code Playgroud)

Mathematica图形

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