2011-12-15 266 views
3

我想在一個圖中製作一個動態數量的下拉菜單,繪製不同數量的曲線。 我有previously請求幫助來繪製這些數據,並且它運行良好。Mathematica:菜單的動態數

第一件事

Needs["PlotLegends`"] 

這裏是數據的例子(沒有實際數字,因爲它們是waaay太長)。

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

化合物變量是化合物+ 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 
] 

Mathematica graphics

正如你可以看到,我可以很容易地通過重複添加化合物這三行中的每一行(數據,圖例和菜單描述符),但這是蹩腳的和低效率的。繪製一個集合需要大約20秒,所以這裏大約1分鐘(並且我使用了一個非常高效的集羣)。

是否有解決方案添加一個小菜單或字段,我可以添加化合物的數量繪圖,所以正確數量的菜單將顯示?我不需要超過7個地塊,但效率...

數字2,4,16是繪圖的默認值。我可以用默認值的列表(2,14,16,和其他一些我可能會挑),或者他們可以全部設置爲2

感謝

+1

您的代碼不運行,它是不完整的。什麼是'數據'?最好發佈一個實際運行的小型完整示例。 – Nasser 2011-12-15 14:37:37

+0

我添加了一部分我使用的數據。 – 2011-12-15 15:17:42

回答

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

Mathematica graphics

如果沒有PlotLegend,對於大約1000x1000元素的隨機數據集,此運行速度非常快。如果我在ListLogLogPlot中包含PlotLegend選項,它會變慢很多,這可能是代碼太慢的原因。

4

如何像:

Manipulate[ 
Manipulate[ ListLogLogPlot[Table[Subscript[x, n], {n, 1, numCompounds}]], 
    [email protected][Sequence,Table[{{Subscript[x, n], n + 1, "Compound " <> [email protected]}, 
    Thread[Range[2, compounds] -> Drop[data[[1]], 1]]}, {n, 1, 
    numCompounds}]], ContinuousAction -> False], 
{{numCompounds, 3}, 1, compounds - 1, 1}] 

Mathematica graphics

4

我想我會添加一個DM版本。如果你像我一樣,你會發現比操縱更容易。它基本上是海克答案的DM版本。

DynamicModule[{data,compounds,n=1,c={2},labels}, 

    data=yourData; 

    compounds=Length[data[[1]]]; 
    [email protected]@@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} 
    ], 
    [email protected][data[[All,{1,#}]]&/@c] 
    }] 
] 

Mathematica graphics

我用網,因爲它可以讓你輕鬆地對準所有控制器和它們的標籤。 PadRight[c,n,2]允許您在更改n的值時保持當前設置。我會避免情節傳說,並始終讓自己的。