[圖表建構器] 批次固定所選行的懸停標籤各位,
目前我使用 JMP16 來建立圖表。
我有一列圖片,我想將圖片固定在我選擇的每個點上,所以我打開了該列的「新增標籤」功能。
但我發現我只能將滑鼠指標懸停在圓點上,等待懸停標籤顯示出來,然後點擊圖釘按鈕才能逐一固定它。
有沒有更快的方法,例如用JSL程式碼?我有上百萬行數據需要顯示圖片。
謝謝!
自動化和腳本編寫回覆:[圖表建構器] 批次固定所選行的懸停標籤必須使用懸停標籤嗎?或是可以直接在圖表中使用圖片作為符號?例如,使用「大類家庭」範例資料集:

如果您只想為選定的行新增圖片,可以選取這些行,並將“選定列”命名為“選定列”,然後使用該列建立一個“轉換列”,如下所示:
// 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 ) )
)
);
我附上了腳本,方便您一鍵查看結果,但其實所有操作都可以在圖表構建器中完成,無需編寫腳本。主要功能包括“轉換列”和“設定列形狀” 。
回覆:[圖表建構器] 批次固定所選行的懸停標籤這裡有一個固定懸停標籤的範例。值得注意的是,選擇操作是從零開始索引的。可能需要修改程式碼以處理未選擇任何行的情況。
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 )
)
);

回覆:[圖表建構器] 批次固定所選行的懸停標籤謝謝回覆!使用「設定形狀列」功能效果很好,但如果也能顯示點就更好了。這確實是很方便的方法!
回覆:[圖表建構器] 批次固定所選行的懸停標籤
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 軸的值並將它們賦值給原點。雖然這在數值軸上完美運行,但傳遞字元列值會導致應用程式崩潰。有沒有針對字元列的解決方法?謝謝!
回覆:[圖表建構器] 批次固定所選行的懸停標籤對於名目/序數列,座標軸從 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);
回覆:[圖表建構器] 批次固定所選行的懸停標籤謝謝!它似乎返回了所有 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);
);
回覆:[圖表建構器] 批次固定所選行的懸停標籤對我來說,這似乎返回了正確的值。
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};
回覆:[圖表建構器] 批次固定所選行的懸停標籤哦,我現在明白問題所在了:隱藏或排除行會導致剩餘資料的索引不符。
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 行的註解移到錯誤的位置。
有什麼辦法可以避免這種情況發生嗎?我的意思是,我肯定有一些數據點需要排除在外。
回覆:[圖表建構器] 批次固定所選行的懸停標籤成功了,謝謝各位!
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);
回覆:[圖表建構器] 批次固定所選行的懸停標籤我會從 selrows 中刪除已排除的行。
selrows = dt << Get Rows Where(Selected() & !Excluded())
回覆:[圖表建構器] 批次固定所選行的懸停標籤如果圖表建構器具有本機資料過濾器,則索引不匹配,這是個壞消息。
有沒有辦法處理啟用了局部濾鏡的圖?
回覆:[圖表建構器] 批次固定所選行的懸停標籤您可以透過傳送訊息來取得本機資料篩選器將顯示的行。
<< Get Filtered Rows;
本地資料過濾器
回覆:[圖表建構器] 批次固定所選行的懸停標籤謝謝你的幫忙!我快完成了!
順便問一下,有沒有辦法批次刪除腳本新增的註解?
gb << SendToReport( Dispatch( {}, "Graph Builder", FrameBox(__which__), __pin_expr__ ) )
回覆:[圖表建構器] 批次固定所選行的懸停標籤如果你能獲取到所有這些引用,我認為你可以將「關閉」或「刪除」訊息設定到列表中,以便同時刪除它們。你可能還需要在刪除前使用「無效」訊息,並在刪除後使用「更新視窗」訊息。
回覆:[圖表建構器] 批次固定所選行的懸停標籤我的程式碼是為透過 gb = (Current Report() << Find( "Graph Builder" )) << Get Scriptable Object 取得的現有圖形建構器設計的;
然後我按照 mmarchandFSLR 的方法建立了一個 Eval 迴圈:
我似乎只能訪問到 GB 本身,但無法從下面的程式碼中定義“添加引腳註釋”列表:
有沒有辦法讀取每個物件的唯一 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 ),
)
)
);
回覆:[圖表建構器] 批次固定所選行的懸停標籤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;
回覆:[圖表建構器] 批次固定所選行的懸停標籤哦,我現在明白問題所在了:隱藏或排除行會導致剩餘資料的索引不符。
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 行的註解移到錯誤的位置。
有什麼辦法可以避免這種情況發生嗎?我的意思是,我肯定有一些數據點需要排除在外。
回覆:[圖表建構器] 批次固定所選行的懸停標籤謝謝jthi!非常感謝!
回覆:[圖表建構器] 批次固定所選行的懸停標籤@jthi不好意思,請問有沒有類似當前報告/當前數據表之類的示例方法來獲取用戶當前選擇的幀?
我僅在圖表添加了腳本的情況下才使用此方法。
For Each( {f, n}, frames,
Eval( Eval Expr( f << AddGraphicsScript( Handle( ::currentFrame = Expr( f ) ) ) ) )
);
回覆:[圖表建構器] 批次固定所選行的懸停標籤您可以使用 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']");
回覆:[圖表建構器] 批次固定所選行的懸停標籤謝謝!我需要將圖框顯示在滑鼠遊標下方(無論是懸停還是點擊)。我考慮過使用 S + 單擊進行選擇,但有沒有更簡單的方法呢?
回覆:[圖表建構器] 批次固定所選行的懸停標籤在 JMP 中實現這些操作要困難得多,因為(大多數情況下)很難獲取遊標位置,即使可以獲取,也仍然需要計算哪個幀位於座標下方。雖然可以取得點擊事件,但必須先為每個幀框添加圖形腳本(圖形腳本會在滑鼠點擊/懸停/按住並拖曳等情況下觸發)。根據腳本的特定功能,可能還有其他方法,例如,您可以向使用者提供幀框列表,讓他們選擇要新增圖形腳本的幀框,然後提示使用者點擊「確定」。