2011-12-15 18 views
3

私は、プロット内に動的な数のドロップダウンメニューを作って、さまざまな数の曲線をプロットしようとしています。 私はpreviouslyがこのデータをプロットするのに必要なヘルプを持っており、うまくいきました。 (彼らはwaaay長すぎるとしてではなく、実際の数値)Mathematica:メニューの動的数

まず最初にここで

Needs["PlotLegends`"] 

データの一例です。

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つ

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

あなたが見ることができるように多くの化合物+今のところ1

compounds=8 

です化合物、私は簡単に複製を追加することができます3つの行(データ、凡例、およびメニュー記述子)のそれぞれを指定しますが、それは不十分で非効率です。プロットには約20秒かかりますので、ここでは約1分です(かなり効率的なクラスターを使用しています)。

プロットする化合物の数を追加できる小さなメニューやフィールドを追加するソリューションがありますか?そのため、適切な数のメニューが表示されますか?私は7つ以上のプロットを必要としませんが、効率は...

数字2、4、16はプロットのデフォルト値です。私は、デフォルト値のリストを作ることができます(2、14、16、および他のいくつかは、私が選ぶ場合があります)、またはそれらはすべてが2

おかげ

+1

コードが実行されず、完全ではありません。 「データ」とは何ですか?実際に実行される小さな完全な例を投稿する方がよいでしょう。 – Nasser

+0

私が使用するデータの一部を追加しました。 –

答えて

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

0123のような何かを行うことができます

PlotLegendが指定されていない場合、約1000x1000要素のランダムデータセットでは非常に高速です。 ListLogLogPlotPlotLegendオプションを含めると、速度が非常に遅くなるため、コードが非常に遅い理由が考えられます。

+0

これは完璧で高速です。私はその種のプロットに精通しておらず、凡例機能の間違った配置はすべてを減速させていました。ありがとう。 –

+0

このコードにはバグがあります(少なくともこれが提供されたデータで動作するようにしようとすると)。番号16は、化合物の数以下の数で置き換える必要があります。レンジ[化合物-1] –

+0

に変更することができます。i = PadRight [i、n、2]を使用すると、nの値を変更するときに既存の選択肢を残すことができます。 –

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の値を変更すると現在の設定を維持できます。私はプロットの伝説を避け、いつもあなた自身のものを作っています。

関連する問題