A p*_*doc 5 plot wolfram-mathematica dynamic matrix
我试图使用Mathematica 7动态绘制矩阵中包含的数据.数据包含在其中,通过化学模型获得.
[year H He Li C ... C8H14+,Grain- ]
[0 0 0.03 0.009 1E-3 ... 0 ]
[100 .1 0.03 0.009 1E-3 ... 0 ]
[200 .2 0.03 0.009 1E-3 ... 0 ]
[300 .2 0.03 0.009 1E-3 ... 0 ]
[... ... ... ... ... ... ... ]
[1E6 .5 0.03 0.003 1E-8 ... 1E-25 ]
Run Code Online (Sandbox Code Playgroud)
事实是,矩阵维度是2001*1476(2000步和名称的第一行,1475个化合物+ 1年的列),非常沉重.我试图绘制任何具有浓度/年份图的化合物.这有效
Manipulate[
ListLogLogPlot[data[[All, {1, i}]], PlotLabel -> data[[1, i]] ],
{{i, 2, "Compound"}, 2, compounds, 1}
]
Run Code Online (Sandbox Code Playgroud)
其中数据是矩阵,并且化合物是在模型化合物的数量上设置的变量(这里是1475)."compound"是滑块的标签.问题是,滑块移动得快到几厘米浏览1400多个项目.我尝试用下拉菜单
MenuView[
Table[
ListLogLogPlot[data[[All, {1, i}]],PlotLabel -> data[[1, i]]], {i, 2, compounds}
]
]
Run Code Online (Sandbox Code Playgroud)
它也有效,但这是一个处理器杀手程序(执行16个内核的Xeon 16核服务器上10分钟以上),因为Mathematica尝试在显示所有图之前绘制所有图.此外,下拉列表没有名称,只有一系列数字(对于C8H14N +,颗粒为1,氢为1至1475),即使该图有名称.
我正在寻找一种仅按需绘制图形的方法,名称显示在下拉列表中(如果默认情况下需要H).或者我可以输入化合物名称的字段.这似乎可以使用Dynamic []命令,但我无法使其正常工作.
谢谢
迈克的建议很好,但如果你不想把它放在数据库中,请使用该ContinuousAction->False选项.
testdata =
Join[{Table[ToString[series[i-1]], {i, 1475}]},
RandomReal[{1., 100.}, {2000, 1476}]];
Manipulate[
ListLogLogPlot[testdata[[All, {1, i}]],
PlotLabel -> testdata[[1, i]]], {{i, 2, "Compound"}, 2, 1475, 1},
ContinuousAction -> False]
Run Code Online (Sandbox Code Playgroud)

要获取弹出菜单,请使用{i,listofvalues}控制器规范的语法.
Manipulate[
ListLogLogPlot[testdata[[All, {1, i}]],
PlotLabel -> testdata[[1, i]]], {i, Range[2, 1475]},
ContinuousAction -> False]
Run Code Online (Sandbox Code Playgroud)

这在我的系统上运行得非常快.(两年前的MacBook Pro)
一位发烧友版本:
spec = Thread[Range[2, 1476] -> Table[ToString[series[i]], {i, 1475}]];
Manipulate[
ListLogLogPlot[testdata[[All, {1, i}]],
PlotLabel -> testdata[[1, i]]], {{i, 2, "Compound"}, spec},
ContinuousAction -> False]
Run Code Online (Sandbox Code Playgroud)

如果您只想逐步浏览图像,请单击滑块控制器旁边的小加号以获得更详细的控件.

要在InputField中输入名称,您可以执行类似的操作
compounds = Rest[data[[1]]];
Manipulate[
If[MemberQ[compounds, compound], i = Position[compounds, compound][[1, 1]] + 1];
ListLogLogPlot[data[[All, {1, i}]], PlotLabel -> data[[1, i]]],
{{i, 2}, None},
{{compound, data[[1, 2]], "Compound"}, InputField[#, String] &}]
Run Code Online (Sandbox Code Playgroud)
这里compounds列出了化合物的所有名称.该If报表Manipulate是检查在输入的名称是否InputField是一个有效的化合物或没有.
其他人已经给你创建一个大弹出列表的方法.如果您不想滚动1475个化合物的弹出列表,可以考虑将弹出列表拆分为子列表.例如,这会将整个化合物列表拆分为n=50元素的子列表,这可能使其更容易导航
compounds = Rest[data[[1]]];
With[{n = 50},
Manipulate[
i = 1 + Position[compounds, name][[1, 1]];
ListLogLogPlot[data[[All, {1, i}]], PlotLabel -> data[[1, i]]],
{{i, 2}, None},
{{indexlist, 1, "Indices"},
Table[i -> ToString[(i - 1) n + 1] <> " through " <>
ToString[Min[i n, Length[compounds]]],
{i, Ceiling[Length[compounds]/n]}], PopupMenu},
{{name, compounds[[1]], "Compound"},
compounds[[n (indexlist - 1) + 1 ;;
Min[Length[compounds], n indexlist]]], PopupMenu}
]
]
Run Code Online (Sandbox Code Playgroud)
例如,对于
data = Table[Join[{i}, RandomReal[{0, 1}, 1000]], {i, 1000}];
data = Join[{Prepend[Table["list " <> ToString[i], {i, 1000}], "year"]}, data];
Run Code Online (Sandbox Code Playgroud)
这看起来像
