[グラフビルダー] 選択した行のホバーラベルを一括で固定する親愛なるみんな、
現在、私はJMP16を使ってグラフを作成しています。
画像を含む列があり、選択した各ドットに画像を固定したいので、この列の「ラベルを追加」をオンにします。
しかし、ドットの上にポインターをホバーさせ、ホバーラベルが表示されるのを待ってから、ピンボタンをクリックして一つずつピン留めするしかないことがわかりました。
JSLコードのような、もっと速い方法はありますか?何百万行もの画像を表示する必要があるんです。
ありがとう!
自動化とスクリプト作成Re: [グラフビルダー] 選択した行のホバーラベルを一括で固定するホバーラベルにする必要がありますか?それとも、グラフのシンボルとして画像を使用することもできますか?例えば、Big Class Familiesサンプルデータセットを使用する場合:

選択した行の画像のみが必要な場合は、それらの行を選択して「列の選択」に名前を付け、その列を使用して次のように変換列を作成できます。
// Open Data Table: Big Class Families.jmp
// → Data Table( "Big Class Families" )
Open( "$SAMPLE_DATA/Big Class Families.jmp" );
// Name selection in column: Use Images
Data Table( "Big Class Families" ) << Clear Select <<
Select Rows( [1, 6, 14, 15, 16] ) <<
Name Selection in Column( Column Name( "Use Images" ), Selected( 1 ) );
Graph Builder(
Transform Column( "Transform[height]", Formula( :height * :Use Images ) ),
Size( 648, 551 ),
Show Control Panel( 0 ),
Variables(
X( :weight ),
Y( :height ),
Y( :"Transform[height]"n, Position( 1 ) )
),
Elements(
Points( X, Y( 1 ), Y( 2 ), Legend( 3 ) ),
Points( X, Y( 2 ), Legend( 5 ), Set Shape Column( :picture ) )
)
);
スクリプトを同梱したので、ワンクリックで結果を確認できますが、これはスクリプトを使わなくてもGraph Builder内で全て実行できます。主な機能は「列の変換」と「列の形状設定」です。
Re: [グラフビルダー] 選択した行のホバーラベルを一括で固定するホバーラベルを固定する例を以下に示します。選択範囲が0から始まるインデックスになっているのが興味深い点です。行が選択されていない場合にも対応できるように修正する必要があるかもしれません。
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class Families.jmp" );
dt << Select Rows( [1 5 7] );
pin_expr = {};
For Each( {v, i}, dt << Get Selected Rows,
Insert Into(
pin_expr,
Eval(
Eval Expr(
{Add Pin Annotation(
Seg( Marker Seg( 1 ) ),
Index( Expr( v - 1 ) ),
Index Row( Expr( v - 1 ) ),
UniqueID( Expr( v - 1 ) )
)}
)
)
)
);
Eval(
Substitute(
Expr(
dt << Graph Builder(
Size( 658, 556 ),
Show Control Panel( 0 ),
Variables( X( :weight ), Y( :height ) ),
Elements( Points( X, Y, Legend( 5 ) ) ),
SendToReport( Dispatch( {}, "Graph Builder", FrameBox, __pin_expr__ ) )
)
),
Expr( __pin_expr__ ), Name Expr( pin_expr )
)
);

Re: [グラフビルダー] 選択した行のホバーラベルを一括で固定するご返信ありがとうございます!Set Shape Columnを使うとうまくいきますが、ポイントも表示できればさらに良いですね。これは確かに便利な方法です!
Re: [グラフビルダー] 選択した行のホバーラベルを一括で固定する
For Each( {v, i}, row_selection,
local_x = Column( dt, col_x )[v];
local_y = Column( dt, col_y )[v];
Insert Into(
pin_expr,
Eval(
Eval Expr(
{Add Pin Annotation(
Seg( Marker Seg( 1 ) ),
Index( Expr( v - 1 ) ),
Origin( {Expr( local_x ), Expr( local_y )} ),
Index Row( Expr( v - 1 ) ),
UniqueID( Expr( v - 1 ) ),
Offset( {-50, -45} ),
Replace Text( " " ),
Filled( 0 ),
Tag Line( 1 )
)}
)
)
);
);
素晴らしい!うまくいきましたが、原点設定がないと、すべての注釈がまったく同じ位置に固定されてしまいます。これを修正するために、x/y軸の値を読み取り、原点に割り当てました。数値軸ではこれで完璧に動作しますが、文字型の列値を渡すとアプリがクラッシュします。文字型の列に対する回避策はありますか?よろしくお願いします!
Re: [グラフビルダー] 選択した行のホバーラベルを一括で固定する名義尺度/順序尺度の列の場合、軸は0から始まり、各値が1ずつ増加します。これは軸の設定で確認できます。

データテーブルに基づいてこれを処理するロジックを記述するか、ポイントプロットがある場合はマーカーから値を取得できます。
Names Default To Here(1);
dt = open("$SAMPLE_DATA/Big Class.jmp");
gb = dt << Graph Builder(Variables(X(:age), Y(:height)), Elements(Points(X, Y, Legend(3))));
ms = report(gb)[framebox(1)] << find seg(markerseg(1));
Show(ms << Get X Values, ms << Get Y Values);
Re: [グラフビルダー] 選択した行のホバーラベルを一括で固定するありがとうございます!すべてのX/Y値が返されるようですが、選択した行のX/Y値を読み取るにはどうすればよいでしょうか?以下のコードを試してみましたが、返されたX/Y値は選択した位置のものではありません。
r = dt << Get Selected Rows();
ms = Report(gb)[framebox(1)] << Find Seg( Marker Seg( 1 ) );
For Each( {v, i}, r,
t = ms << Get Point( v );
x = t[1];
y = t[2];
show(x,y);
);
Re: [グラフビルダー] 選択した行のホバーラベルを一括で固定する私にとっては、これは正しい値を返すようです
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
gb = dt << Graph Builder(Variables(X(:age), Y(:height)), Elements(Points(X, Y, Legend(3))));
dt << Select Rows([1, 10, 16, 20, 30]);
ms = Report(gb)[framebox(1)] << Find Seg(Marker Seg(1));
selrows = dt << Get Selected Rows();
For Each({currow}, selrows,
coord = ms << Get Point(currow);
Show(coord);
);

coord = {0, 59};
coord = {1, 61};
coord = {1, 65};
coord = {1, 63};
coord = {2, 61};
coord = {2, 62};
coord = {3, 67};
Re: [グラフビルダー] 選択した行のホバーラベルを一括で固定するああ、問題点が分かりました。行を非表示にしたり除外したりすると、残りのデータに対してインデックスの不一致が発生するのですね。
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
gb = dt << Graph Builder(Variables(X(:age), Y(:height)), Elements(Points(X, Y, Legend(3))));
dt << Select Rows([1, 10, 16, 20, 30]);
ms = Report(gb)[framebox(1)] << Find Seg(Marker Seg(1));
selrows = dt << Get Selected Rows();
pin_expr = {};
For Each({v}, selrows,
coord = ms << Get Point(v);
Show(coord);
Insert Into(
pin_expr,
Eval(
Eval Expr(
{Add Pin Annotation(
Seg( Marker Seg( 1 ) ),
Index Row( Expr( v - 1 ) ),
Origin( Expr(coord)),
UniqueID( Expr( v - 1 ) )
)}
)
)
)
);
Eval(
Substitute(
Expr( Report(gb)[framebox(1)] << __pin_expr__ ),
Expr( __pin_expr__ ), Name Expr( pin_expr )
)
);
このコードを使用すると、17行目が非表示/除外された場合、20行目と30行目の注釈が誤った位置に移動します。
これを防ぐ方法はありますか?もちろん、除外すべきデータポイントはあります。
Re: [グラフビルダー] 選択した行のホバーラベルを一括で固定するうまくいきました、皆さんありがとう!
ex = dt << Get Excluded Rows;
pin_expr = {};
For Each( {v}, dt << Get Selected Rows,
offset = N Rows(Loc(ex < v));
coord = ms << Get Point(v - offset);
Re: [グラフビルダー] 選択した行のホバーラベルを一括で固定する既に除外されている行をselrowsから削除します
selrows = dt << Get Rows Where(Selected() & !Excluded())
Re: [グラフビルダー] 選択した行のホバーラベルを一括で固定するグラフビルダーにローカルデータフィルターが設定されている場合、インデックスが一致しないという問題が発生します。
ローカルフィルタが有効なグラフを処理する方法はありますか?
Re: [グラフビルダー] 選択した行のホバーラベルを一括で固定するローカルデータフィルタが表示する行は、メッセージを送信することで取得できます。
<< Get Filtered Rows;
ローカルデータフィルタへ
Re: [グラフビルダー] 選択した行のホバーラベルを一括で固定するご協力ありがとうございました!もうすぐです!
ところで、スクリプトによって追加された注釈を一括で削除する方法はありますか?
gb << SendToReport( Dispatch( {}, "Graph Builder", FrameBox(__which__), __pin_expr__ ) )
Re: [グラフビルダー] 選択した行のホバーラベルを一括で固定するそれらすべてへの参照を取得できるのであれば、リストに「<< Close」または「<< Delete message」を設定して、すべて同時に削除できると思います。また、削除前に「<< inval」、削除後に「<< update window」を使用することもできます。
Re: [グラフビルダー] 選択した行のホバーラベルを一括で固定する私のコードは、gb = (Current Report() << Find( "Graph Builder" )) << Get Scriptable Object; によって取得される既存のグラフビルダー用に設計されています。
そこで、mmarchandFSLRさんのやり方でEvalループを作成しました。
どうやら、GB自体にはアクセスできるものの、以下のコードからAdd Pin Annotationリストを定義する場所が見当たらないようです。
それぞれの固有IDなどを読み取って、それに「<
pin_expr = {};
For Each( {v, i}, dt << Get Selected Rows,
Insert Into(
pin_expr,
Eval(
Eval Expr(
{Add Pin Annotation(
Seg( Marker Seg( 1 ) ),
Index( Expr( v - 1 ) ),
Index Row( Expr( v - 1 ) ),
UniqueID( Expr( v - 1 ) )
)}
)
)
)
);
.....
If( N Items( pin_expr ) > 0,
Eval(
Substitute(
Expr(
gb << SendToReport( Dispatch( {}, "Graph Builder", FrameBox(__which__), __pin_expr__ ) )
),
Expr( __pin_expr__ ), Name Expr( pin_expr ),
)
)
);
Re: [グラフビルダー] 選択した行のホバーラベルを一括で固定するNames Default To Here(1);
dt = open("$SAMPLE_DATA/Big Class.jmp");
dt << select rows([1, 10, 21, 30, 40]);
gb = dt << Graph Builder(
Size(658, 556),
Show Control Panel(0),
Variables(X(:age), Y(:height)),
Elements(Points(X, Y, Legend(3)))
);
pins = {};
gb << inval;
frame = Report(gb)[FrameBox(1)];
For Each({currow}, dt << Get Selected Rows,
Eval(EvalExpr(
Insert Into(pins, frame << Add Pin Annotation(
Seg(Marker Seg(1)),
Index(Expr(currow - 1)),
Index Row(Expr(currow - 1)),
UniqueID(Expr(currow - 1))
));
));
);
gb << update window;
wait(1); // demo purposes
pins << Delete;
Re: [グラフビルダー] 選択した行のホバーラベルを一括で固定するああ、問題点が分かりました。行を非表示にしたり除外したりすると、残りのデータに対してインデックスの不一致が発生するのですね。
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
gb = dt << Graph Builder(Variables(X(:age), Y(:height)), Elements(Points(X, Y, Legend(3))));
dt << Select Rows([1, 10, 16, 20, 30]);
ms = Report(gb)[framebox(1)] << Find Seg(Marker Seg(1));
selrows = dt << Get Selected Rows();
pin_expr = {};
For Each({v}, selrows,
coord = ms << Get Point(v);
Show(coord);
Insert Into(
pin_expr,
Eval(
Eval Expr(
{Add Pin Annotation(
Seg( Marker Seg( 1 ) ),
Index Row( Expr( v - 1 ) ),
Origin( Expr(coord)),
UniqueID( Expr( v - 1 ) )
)}
)
)
)
);
Eval(
Substitute(
Expr( Report(gb)[framebox(1)] << __pin_expr__ ),
Expr( __pin_expr__ ), Name Expr( pin_expr )
)
);
このコードを使用すると、17行目が非表示/除外された場合、20行目と30行目の注釈が誤った位置に移動します。
これを防ぐ方法はありますか?もちろん、除外すべきデータポイントはあります。
Re: [グラフビルダー] 選択した行のホバーラベルを一括で固定するjthiさん、ありがとうございます!本当に感謝しています!
Re: [グラフビルダー] 選択した行のホバーラベルを一括で固定する@jthi申し訳ありませんが、現在のレポートや現在のデータテーブルのように、ユーザーが選択した現在のフレームを取得するサンプル方法はありますか?
私はこれを使いますが、グラフにスクリプトが追加されている場合に限ります。
For Each( {f, n}, frames,
Eval( Eval Expr( f << AddGraphicsScript( Handle( ::currentFrame = Expr( f ) ) ) ) )
);
Re: [グラフビルダー] 選択した行のホバーラベルを一括で固定するXPathを使用して、選択された属性(値がtrueのもの)を検索できます。
Names Default To Here(1);
//This message applies to all display box objects
dt = Open("$SAMPLE_DATA/Big Class.jmp");
biv = dt << Run Script("Bivariate");
Report(biv)[FrameBox(1)] << Select(1);
report(biv) << XPath("//FrameBox[@selected='true']");
Re: [グラフビルダー] 選択した行のホバーラベルを一括で固定するありがとうございます!実は、マウスカーソルの下にあるフレーム(ホバー時またはクリック時)を取得したいんです。Sキーとクリックを組み合わせて選択することも考えましたが、もっと簡単な方法はありますか?
Re: [グラフビルダー] 選択した行のホバーラベルを一括で固定するJMPではカーソル位置へのアクセスが容易ではないため(ほとんどの場合)、これらの操作ははるかに困難です。たとえアクセスできたとしても、どのフレームが座標の下にあるかを計算する必要があります。クリックを取得することはできますが、まず各フレームボックスにグラフィックスクリプトを追加する必要があります(グラフィックスクリプトはマウスのクリック、ポイントへのホバー、ホールド&ドラッグなどでトリガーされます)。スクリプトの動作によっては、他の方法もあります。たとえば、フレームボックスのリストをユーザーに提供し、グラフィックスクリプトを追加するフレームボックスを選択させた後、OKを押すように促すことができます。