2011-08-08 17 views
9

ListPlotまたはLog-companionsで複数のデータセットを同時に視覚化する必要があることがよくあります。データセットの数は通常、容易に区別できるラインスタイルの数よりも多いので、大規模なプロットの凡例を作成するのはやや不得手です。私はまだ、プロットのさまざまなライン/セットに注釈を付ける良い方法を探しています。ツールチップは画面上で作業するときには便利ですが、プロットする必要がある場合は役立ちません。ListPlotsで複数のデータセットに注釈を付ける方法

は最近、私は結果が私のマシン(Windows 7のx64の、Mathematicaの8.0.1)に次のようになります

GraphicsGrid[Partition[Table[ListPlot[ 
[email protected] 
Table[{Sin[x], Cos[x], Tan[x], Cot[x]}, {x, 0.01, 10, 0.1}], 
PlotMarkers -> {"1", "2", "3", "4"}, Mesh -> i, Joined -> True, 
PlotLabel -> "Mesh\[Rule]" <> ToString[i], ImageSize -> 180], {i, 
1, 30}], 4]] 

を私のデータセットを列挙するためにメッシュオプションで遊んといくつかの奇妙なものが見つかりました:

 Mesh = i, with i running from 1 to 30

面白いことに、メッシュ - > 2、8、および10の場合、結果は期待どおりに見えますが、残りの部分はそうではありません。私はメッシュオプションを理解していないか、それとも私を理解していません。

ここに私の質問は以下のとおりです。

  1. はメッシュがListPlotの中では、盗聴や私が間違ってそれを使うのですか?
  2. オーバープリントを避けるために、どのように連続したセットのメッシュポイントをxシフトできますか?
  3. プロット内の複数のデータセットに注釈を付ける/列挙する方法は他にもありますか?
+3

PlotMarkers'がで思いついたMesh'と ''との間の相互の問題[このSO質問](http://stackoverflow.com/questions/4789047/custom-intervals-of-markers- in-mathematica-plotmarkers/4790805#4790805)である。私はそれをWRIに報告し、技術サポートはそれを開発グループに転送して調べました。うまくいけば、それは次のリリースで修正される予定です。 – Simon

+1

メッシュオプションのいくつかがなぜ機能しないのか不思議です。 –

+2

3番目の質問については、私がここで使用したグラフを見てみるとよいでしょう:http://stackoverflow.com/questions/5745298/how-do-i-access-the-stackoverflow-api-from-mathematica/5745783 #5745783。これには手作業による注釈(半自動で作業することができます)が含まれます。私は最終結果が他の多くの方法よりも視覚的にずっと嬉しいと感じています。 –

答えて

12

これらの行に沿って何か試してみることができます。各行をクリックすると、それ自体を識別するボタンにします。

plot=Plot[{Sin[x],Cos[x]},{x,0,2*Pi}]; 
sinline=plot[[1,1,3,2]]; 
cosline=plot[[1,1,4,2]]; 
message=""; 
altplot=Append[plot,PlotLabel->Dynamic[message]]; 
altplot[[1,1,3,2]]=Button[sinline,message="Clicked on the Sin line"]; 
altplot[[1,1,4,2]]=Button[cosline,message="Clicked on the Cos line"]; 
altplot 

あなたはEventHandlerのを追加した場合、あなたがクリックした位置を取得し、プロットに関連した位置のラベルとインセットを追加することができます。プロットをダイナミックにラップすると、ボタンをクリックするたびに更新されます。それはうまく動作します。

plot = Plot[{Sin[x], Cos[x]}, {x, 0, 2*Pi}]; 
sinline = plot[[1, 1, 3, 2]]; 
cosline = plot[[1, 1, 4, 2]]; 
AddLabel[label_] := (AppendTo[plot[[1]], 
    Inset[Framed[label, Background -> White], pt]]; 
    (* Remove buttons for final plot *) 
    plainplot = plot; 
    plainplot[[1, 1, 3, 2]] = plainplot[[1, 1, 3, 2, 1]]; 
    plainplot[[1, 1, 4, 2]] = plainplot[[1, 1, 4, 2, 1]]); 
plot[[1, 1, 3, 2]] = Button[sinline, AddLabel["Sin"]]; 
plot[[1, 1, 4, 2]] = Button[cosline, AddLabel["Cos"]]; 
Dynamic[EventHandler[plot, 
    "MouseDown" :> (pt = MousePosition["Graphics"])]] 

行にラベルのクリックを追加するには:コメントに応えて

、ここでの充実したバージョンです。 'plainplot'に設定された最後の注釈付きグラフは、印刷可能でコピー可能であり、動的要素を含んでいません。

[後日]別のバージョン、今回は一般的で、初期のチャートに基づいています。 (Mark McClureのソリューションの部分が使用されています)さまざまなプロットに対して、 'ff'と 'spec'は必要に応じて編集できます。

ff = {Sin, Cos, Tan, Cot}; 
spec = Range[0.1, 10, 0.1]; 
(* Plot functions separately to obtain line counts *) 
plots = Array[ListLinePlot[ff[[#]] /@ spec] &, [email protected]]; 
plots = DeleteCases[plots, Line[_?(Length[#] < 3 &)], Infinity]; 
numlines = Array[[email protected][plots[[#]], Line[_], Infinity] &, 
    [email protected]]; 
(* Plot functions together for annotation plot *) 
plot = ListLinePlot[#@spec & /@ ff]; 
plot = DeleteCases[plot, Line[_?(Length[#] < 3 &)], Infinity]; 
lbl = [email protected][ConstantArray[[email protected][[#]], 
     numlines[[#]]] &, [email protected]]; 
(* Line positions to substitute with buttons *) 
linepos = Position[plot, Line, Infinity]; 
Clear[line]; 
(* Copy all the lines to line[n] *) 
Array[(line[#] = plot[[Sequence @@ [email protected][[#]]]]) &, 
    [email protected]]; 
(* Button function *) 
AddLabel[label_] := (AppendTo[plot[[1]], 
    Inset[Framed[label, Background -> White], pt]]; 
    (* Remove buttons for final plain plot *) 
    plainplot = plot; 
    bpos = Position[plainplot, Button, Infinity]; 
    Array[(plainplot[[Sequence @@ [email protected][[#]]]] = 
     plainplot[[Sequence @@ Append[[email protected][[#]], 1]]]) &, 
    [email protected]]); 
(* Substitute all the lines with line buttons *) 
Array[(plot[[Sequence @@ [email protected][[#]]]] = Button[line[#], 
     AddLabel[lbl[[#]]]]) &, [email protected]]; 
Dynamic[EventHandler[plot, 
    "MouseDown" :> (pt = MousePosition["Graphics"])]] 

次のようになります。アノテーションの後、プレーングラフィックスオブジェクトは 'plainplot'変数に設定されています。

Annotated Chart

+2

非常に興味深いプレゼンテーションのアイデア!これは、ツールチップのための素晴らしい選択肢です(特に、行が何らかの方法で強調表示されている場合、太字にするなど、その上にマウスを置くだけでクリックする必要はありません)。ありがとうございました。 +1 –

+0

しかし、これはツールチップに似ています。これは、プロットが必要な場合には役に立たない傾向があります。しかしプレゼンテーションのためには、素晴らしい方法です。 –

+3

@ Markus - 私は、ラベルが配置された後にスティックが表示されることを示す完全な例を追加したので、注釈付きのプロットを印刷することができます。 –

8

1つの方法は、プロットを別々に生成し、それらを一緒に表示することです。 PlotMarkersは、1つのデータセットを扱うときに期待したやり方で再生するように見えるので、これにより、他の投稿よりもあなたのようなコードが得られます。 PlotStyleColorDataを使用して同じ色を得ることができます。ここでの結果だ:

ff = {Sin, Cos, Tan, Cot}; 
plots = Table[ListLinePlot[ff[[i]] /@ Range[0.1, 10, 0.1], 
    PlotStyle -> {ColorData[1, i]}, 
    PlotMarkers -> i, Mesh -> 22], {i, 1, Length[ff]}]; 
(* Delete the spurious asymptote looking thingies. *) 
plots = DeleteCases[plots, Line[ll_?(Length[#] < 4 &)], Infinity]; 
Show[plots, PlotRange -> {-4, 4}] 

enter image description here

+0

+1これは私が使用する方法です。記号や色を使っていくつかの追加の次元を追跡する必要があることもあります。 – rcollyer

+0

私は上記の例を別々のプロットに分割することが回避策であることを認識していました。 –

4

あなたは計算曲線または実際のデータをプロットするつもりですか?

計算可能なカーブの場合は、plot legend (key)を使用するのが一般的です。 異なるダッシュおよび太さを使用して、グレースケールプリンタ上の線を区別することができます。 PlotLegendsのドキュメントには多くの例があります。

実際のデータの場合、通常、データは実際のデータポイントにPlotMarkers(つまりMeshを指定しない)を使用できるほど疎です。自動PlotMarkersを使用することもできますが、さまざまな不確実性を示すカスタムPlotMarkersBoxWhiskerのマーカーを使用することもできます。

+1

これは本当にこれを行う標準的な方法です。しかし、PlotLegendパッケージには深刻な欠陥があり(http://stackoverflow.com/questions/3463437/plotting-legends-in-mathematica/3533152#3533152参照)、それに美的な問題があると私は感じています。 –

+0

@Sjoerd:私はその質問に気付かなかった。 'PlotLegend'が' Plot'を再スケーリングする方法は良くありません... – Simon

関連する問題