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