Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dynamic Mathematica:菜单的动态数量_Dynamic_Menu_Wolfram Mathematica_Plot - Fatal编程技术网

Dynamic Mathematica:菜单的动态数量

Dynamic Mathematica:菜单的动态数量,dynamic,menu,wolfram-mathematica,plot,Dynamic,Menu,Wolfram Mathematica,Plot,我试图在绘图中创建一个动态数量的下拉菜单,以绘制各种数量的曲线。 我已经请求帮助绘制这些数据,而且效果很好 第一件事 Needs["PlotLegends`"] 这是一个数据的示例(不是实际数字,因为它们太长了) 化合物变量是化合物的数量+1 compounds=8 现在,我的代码是这个 Manipulate[ ListLogLogPlot[ {data[[All, {1, i}]], data[[All, {1, j}]], data[[All, {1, k}]]},

我试图在绘图中创建一个动态数量的下拉菜单,以绘制各种数量的曲线。 我已经请求帮助绘制这些数据,而且效果很好

第一件事

Needs["PlotLegends`"]
这是一个数据的示例(不是实际数字,因为它们太长了)

化合物变量是化合物的数量+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
 ]

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

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

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


谢谢

像这样的东西怎么样:

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}]
操纵[
操纵[ListLogLogPlot[表[下标[x,n],{n,1,numCompounds}]],
Evaluate@Apply[顺序,表[{{下标[x,n],n+1,“化合物”ToString@n}, 
线程[Range[2,components]>Drop[data[[1]],1]},{n,1,
numCompounds}]],ContinuousAction->False],
{{numCompounds,3},1,化合物-1,1}]

你可以这样做

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]]
 ]
]


如果没有
PlotLegend
,对于大约1000x1000个元素的随机数据集来说,这运行速度相当快。如果我在
listlogplot
中包含
PlotLegend
选项,它的速度会降低很多,这可能就是代码如此缓慢的原因

我想我应该添加一个DM版本。如果你像我一样,你可能会发现这比使用操纵更容易。它本质上是海克答案的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]  
  }]
]
DynamicModule[{data,components,n=1,c={2},labels},
数据=你的数据;
化合物=长度[数据[[1]]];
labels=Rule@@@Transpose[{Range[7],data[[1,2;;]}];
纵队[{
动态的[
网格[
加入[
{{“化合物的数量”,弹出菜单[动态[n],范围[7]]},
桌子[
用[{i=i},
c=PadRight[c,n,2];
{“复合”到字符串[i],弹出菜单[Dynamic[c[[i]],labels]}
],
{i,n}
]
],
对齐->{{右,左},中}
],
跟踪符号:>{n}
], 
Dynamic@ListLogLogPlot[数据[[All,{1,#}]&/@c]
}]
]


我使用Grid是因为它允许您轻松地保持所有控制器及其标签对齐
PadRight[c,n,2]
允许您在更改n的值时保持当前设置。我会避免绘制图例,并始终制作自己的图例。

您的代码没有运行,它不完整。什么是“数据”?最好是发布一个实际运行的完整的小示例。我添加了我使用的一部分数据。这工作完美、快速。我不熟悉这种绘图,图例函数的不正确位置使一切都变慢了。谢谢。这段代码中有一个bug(至少当您尝试使用提供的数据时是这样)。数字16应替换为不大于化合物数量的数字。范围[7]可能被范围[Components-1]替换为i=PadRight[i,n,2]允许您在更改n的值时保留现有的选项——那些仍然保留的选项。我正在使用此代码,因为它工作得很好。但是,有没有一种方法可以识别曲线,比如给按钮、按钮前面的文本上色,或者画一个图例?@Billouman:如果你想用绘图中相应的颜色给按钮前面的文本上色,你可以用
行[{“component”,#}]
替换为
样式[Row[{“component”,#}],ColorData[1][#]
(假设您使用的是
ListLogLogPlot
中的标准颜色)。
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]  
  }]
]