Mathematica动态绘制矩阵数据

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 []命令,但我无法使其正常工作.

谢谢

Ver*_*eia 7

迈克的建议很好,但如果你不想把它放在数据库中,请使用该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)

在此输入图像描述

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

在此输入图像描述


Hei*_*ike 5

要在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)

这看起来像

弹出列表