如何將圖形選擇與 JSL 鏈接?大家好!
我正在使用應用程序生成器,並且我使用圖形生成器編寫了幾個不同的圖。 許多圖表使用不同的數據表,這些數據表已使用 Python 進行操作並發送回 JMP。 由於數據在 Python 中經過大量處理,因此這些表不包含任何相同的變量。我正在尋找一種使用 JSL 連接這些圖表上的選擇的方法(例如,如果您選擇其中一個圖例標籤,並且它會使未選擇的項目變灰)。
例如,我正在繪製原始數據和“最終產品”數據的圖表,這些數據大大減少了維度,並且相似的特徵被分組在一起,因此在 Table1/Graph1 中可能有 30 列,而在 Table2/Graph2 中只有 3 列。 如果我有一個包含 Table2 變量的列錶框,並且選擇 Variable1,我希望能夠突出顯示 Graph2 上的 Variable1,同時突出顯示 Graph1 中的相關信息。 我可以確定要突出顯示的相關列/行,但我無法找到如何在圖表上實際設置這些選擇。 如果我可以選擇圖表上的圖例標籤之一(它會自動使未選擇的項目變灰)並編寫一些腳本以便它選擇其他圖表上的相關信息,那就太好了。
是否有一條 JSL 線可以在這樣的圖表上突出顯示某些內容?
大規模定制回复:如何將圖形選擇與 JSL 鏈接?行狀態處理程序在所有行狀態更改時觸發。 因此,當您選擇 1 行時,您會觸發(至少)兩個事件;一項取消選擇,一項選擇。 這很可能會導致一些問題,並且很容易導致循環。 如果您只能捕獲特定事件(選擇、取消選擇、隱藏、排除...),也許它會起作用。
回复:如何將圖形選擇與 JSL 鏈接?我懂了... 謝謝(你的)信息! 由於我要結束有關行狀態處理程序的本章,哈哈,我決定再次嘗試上面提供的“<< 添加圖形腳本”想法,但這次帶有標誌。 當沒有標誌的情況下實現時,它似乎表現出與我上面處理的相同(壞)行為,但是和標誌它似乎有效!
appNS:already_run=0;
Eval(EvalExpr(Report(gb1)[FrameBox(1)] << Add Graphics Script(
If(appNS:already_run==1,
appNS:already_run=0,
f = dt1 << Get Selected Rows;
group_selected = dt1[f, "index1"];
appNS:already_run=1;
expr(dt2) << Select Where(Contains(group_selected, :"index2"));
))));
Eval(EvalExpr(Report(gb2)[FrameBox(1)] << Add Graphics Script(
If(appNS:already_run==1,
appNS:already_run=0,
f = dt2 << Get Selected Rows;
group_selected = dt2[f, "index2"];
appNS:already_run=1;
expr(dt1) << Select Where(Contains(group_selected, :"index1"));
))));
希望隨著我擴展圖形連接,這將繼續發揮作用。 知道為什麼行狀態處理程序會不斷地一遍又一遍地獲取“選擇”(從而在圖形之間創建循環並凍結 JMP)以及為什麼圖形腳本中的相同 JSL 不會?
我真的很感謝你的幫助@jthi & @tx尼爾森!
回复:如何將圖形選擇與 JSL 鏈接?在某些時候,可以在增強日誌中生成“有用”消息

回复:如何將圖形選擇與 JSL 鏈接?行狀態處理程序會發生一些不太有趣的事情(我總是試圖避免它們,因為在我看來它們的工作效果還不錯)。 嘗試通過單擊 Big Class 中的單行來運行我提供的示例,並查看 JMP 日誌。
Names Default To Here(1);
dt1 = Open("$SAMPLE_DATA/Big Class.jmp");
dt2 = dt1 << Summary(
Group(:sex),
Mean(:height),
Mean(:weight),
Freq("None"),
Weight("None"),
Link to original data table(0)
);
Eval(Eval Expr(f1 = Function({a},
rows = Loc(Expr(dt1) << Get Row States, 1);
group_selected = Expr(dt1)[rows, "sex"];
show(Expr(dt1) << Get Row States, a);
Expr(dt2) << Select Where(Contains(group_selected, :sex), current selection("clear"));
wait(1);
)));
rs1 = dt1 << Make Row State Handler(f1);
Eval(Eval Expr(f2 = Function({a},
rows = Loc(Expr(dt2) << Get Row States, 1);
show(Expr(dt2) << Get Row States, a);
group_selected = Expr(dt2)[rows, "sex"];
// Expr(dt1) << Select Where(Contains(group_selected, :sex));
)));
rs2 = dt2 << Make Row State Handler(f2);
dt1 << On Close(
rs1 = .;
rs2 = .;
close(dt2, no save);
);<BR />Clear Log();
回复:如何將圖形選擇與 JSL 鏈接?這就是我一直在嘗試的,但我認為我對狀態/行狀態處理程序/標誌的理解不夠好。 我附上了上述內容的視頻。 所示圖表與 f2 和 dt2 相關:
appNS:already_run=0;
Eval(EvalExpr(f1 = Function({a},
Show(appNS:already_run);<BR /> If(appNS:already_run==1,
appNS:already_run=0,
rows = dt1 << Get Selected Rows;
appNS:already_run=1;
group_selected = dt1[rows, "index1"];
expr(dt2) << Select Where(Contains(group_selected, :"index2"));
))));
rs1 = dt1 << Make Row State Handler(f1);<BR /><BR />Eval(EvalExpr(f2 = Function({a},<BR /> Show(appNS:already_run);
If(appNS:already_run==1,
appNS:already_run=0,
rows = dt2 << Get Selected Rows;
appNS:already_run=1;
group_selected = dt2[rows, "index2"];<BR /> Show(group_selected);
expr(dt1) << Select Where(Contains(group_selected, :"index1"));
))));
rs2 = dt2 << Make Row State Handler(f2);起初我認為拖動會導致問題,因為選擇隨著添加的每個新點而變化,直到拖動完成,但根據日誌中的“group_selected”輸出,甚至看起來選擇都沒有改變。 在我看來,循環是因為在行狀態處理程序中添加了新的選擇,但我不確定如何避免這種情況以實現兩個圖(以及最終更多)相互指向的目標。
歡迎任何建議。
回复:如何將圖形選擇與 JSL 鏈接?我將使用 Show() 語句在日誌中顯示標誌狀態,然後進行拖動,看看是否可以確定計時問題出在哪裡。
回复:如何將圖形選擇與 JSL 鏈接?非常感謝您的回复, @tx尼爾森! 使用標誌是個好主意。 不幸的是,我仍然遇到一些遞歸問題...... 我已經搞亂了標誌變量的不同位置,並且由於我對正在使用的 JSL 的理解有限,當前的語法對我來說最有意義(幾乎完全符合偽代碼的結構)。這是我的:
appNS:already_run=0;
Eval(EvalExpr(f1 = Function({a},
If(appNS:already_run==1,
appNS:already_run=0,
rows = dt1 << Get Selected Rows;
appNS:already_run=1;
group_selected = dt1[rows, "index1"];
expr(dt2) << Select Where(Contains(group_selected, :"index2"));
))));
rs1 = dt1 << Make Row State Handler(f1);<BR /><BR />Eval(EvalExpr(f2 = Function({a},
If(appNS:already_run==1,
appNS:already_run=0,
rows = dt2 << Get Selected Rows;
appNS:already_run=1;
group_selected = dt2[rows, "index2"];
expr(dt1) << Select Where(Contains(group_selected, :"index1"));
))));
rs2 = dt2 << Make Row State Handler(f2);<BR />如果我通過單擊圖例標籤進行選擇(耶!),並且如果我通過單擊繪圖上的各個標記進行單一選擇(耶!),則上述內容確實有效,但如果我嘗試通過拖動選擇窗格進行選擇,則進入循環在實際情節上(這是我的用戶最有可能的情況)。我的標誌變量對於每個單獨的函數應該是不同的嗎? 目前我可以讓它按照我所描述的那樣工作的唯一方法是使用相同的標誌變量...... 難道只是我忽略了一些東西嗎?
如果我什至將鼠標懸停在圖表上而不單擊任何內容,它似乎也會以某種方式改變我的“already_run”標誌變量。 這是由於行狀態處理程序的工作方式造成的嗎?
我感謝您的幫助!
回复:如何將圖形選擇與 JSL 鏈接?當其中一張圖表選擇了點、線等時,從同一數據表生成的所有圖表將自動選擇其點、線等。
如果圖表來自 2 個不同的表,則可以為每個數據表構建行狀態處理程序。您關於循環論證的陳述是正確的,但是,我的處理方式是在每個處理程序中設置一個標誌,以防止循環的繼續。
這是一段簡單的偽代碼,應該可以讓您了解如何設置它
// Pseudo code, not runnable
dt1 = data table( "one" );
dt2 = data table( "twO" );
f1 = Function( {a},
if(flag ==1,
flag = 0,
theRows = dt1 << get selected rows;
flag = 1;
dt2 << select rows(theRows);
);
rs = dt1 << make row state handler( f1 );
f2 = Function( {a},
if(flag ==1,
flag = 0,
theRows = dt2 << get selected rows;
flag = 1;
dt1 << select rows(theRows);
);
rs = dt2 << make row state handler( f2 );回复:如何將圖形選擇與 JSL 鏈接?有沒有一種方法可以使用行狀態處理程序,使 Graph1 上的選擇突出顯示 Graph2 上的相關信息和反之亦然? 我可以以一種方式或另一種方式得到它,但似乎如果我想兩者都做,它就會變成一些凍結 JMP 的循環論證......有沒有一種聰明的方法可以將兩個圖形/數據表指向另一個,而不會導致循環論證?
回复:如何將圖形選擇與 JSL 鏈接?當在圖形生成器、雙變量等圖形中選擇點或線時,將在關聯的數據表中選擇與選擇關聯的行。這與表是否可見無關。因此,實現行狀態處理程序是一件相當簡單的事情,只要檢測到行選擇的更改,該處理程序就會運行。
回复:如何將圖形選擇與 JSL 鏈接?感謝您的回复, @jthi ! 我不確定這些解決方案是否適用於我的情況,除非有一種方法可以簡單地根據圖表上的選擇來確定所選的行/列/索引/等。 我的應用程序中使用的數據表對於用戶進行選擇都不可見...... 這個想法只是與可視化交互,代碼在幕後對錶格進行所有操作。
我覺得對於圖形選擇必須有一些“<< Get Selected”的迭代,但我還沒有在腳本索引中找到正確的實現。 如果有一條 JSL 行,那麼我認為一旦做出選擇,您提到的“<< 添加圖形腳本”想法就可以很好地工作!
回复:如何將圖形選擇與 JSL 鏈接?我從未使用過應用程序生成器,但您可能會使用行狀態處理程序。
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dt_summary = dt << Summary(
Group(:sex),
Mean(:height),
Mean(:weight),
Freq("None"),
Weight("None"),
Link to original data table(0)
);
Eval(EvalExpr(f_summary = Function({a},
f = dt_summary << Get Selected Rows;
group_selected = dt_summary[f, "sex"];
expr(dt) << Select Where(Contains(group_selected, :sex));
)));
rs_summary = dt_summary << make row state handler(f_summary);
nw = New Window("demo",
gb1 = dt << Graph Builder(
Size(529, 457),
Show Control Panel(0),
Variables(X(:weight), Y(:height), Color(:sex)),
Elements(Points(X, Y, Legend(4)))
),
gb2 = dt_summary << Graph Builder(
Size(535, 451),
Show Control Panel(0),
Variables(X(:sex), Y(:"Mean(height)"n), Y(:"Mean(weight)"n, Position(1))),
Elements(Bar(X, Y(1), Y(2), Legend(4), Label("Label by Value")))
);
);
nw << On Close(rs_summary = .);
其他選項可能是使用圖形腳本:
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dt_summary = dt << Summary(
Group(:sex),
Mean(:height),
Mean(:weight),
Freq("None"),
Weight("None"),
Link to original data table(0)
);
nw = New Window("demo",
gb1 = dt << Graph Builder(
Size(529, 457),
Show Control Panel(0),
Variables(X(:weight), Y(:height), Color(:sex)),
Elements(Points(X, Y, Legend(4)))
),
gb2 = dt_summary << Graph Builder(
Size(535, 451),
Show Control Panel(0),
Variables(X(:sex), Y(:"Mean(height)"n), Y(:"Mean(weight)"n, Position(1))),
Elements(Bar(X, Y(1), Y(2), Legend(4), Label("Label by Value")))
);
);
Eval(EvalExpr(Report(gb2)[FrameBox(1)] << Add Graphics Script(
f = dt_summary << Get Selected Rows;
group_selected = dt_summary[f, "sex"];
expr(dt) << Select Where(Contains(group_selected, :sex));
)));
另一種選擇是使用虛擬聯接,但這需要您將數據表保存在某處。