JSL/JMP による R プロット下に示すようなスクリプトがあり、R で簡単な計算を行い、JSL でプロットを表示したいのですが、JSL で 2 つのプロットを表示できません。以下のコードを実行すると、プロット 1 が閉じられ、プロット 2 のみが表示されます。ここで説明されている内容 ( https://community.jmp.com/t5/JMPer-Cable/Getting-started-with-the-JMP-to-R-Interface/ba-p/43920 ) を使用しようとしましたが、うまくいきません。単純なコマンドかもしれませんが、私は JSL の初心者です。お力添えいただければ幸いです。参考までに、私は JMP 17.2 を使用しています。
名前はデフォルトでここに設定されます(1);
Include("Dialog_script.jsl"); // ダイアログをロードして、選択した X 列と Y 列を取得します。
dt = Current Data Table(); // 現在のデータテーブルを取得します
// データテーブルから選択されたX列とY列を取得します
xCol = 列(dt、xColName[1]);
yCol = 列(dt、yColName[1]);
// 列が存在するかどうか確認する
xCol == 空() | yCol == 空()の場合、
Throw("エラー: 選択された列はデータ テーブルに存在しません。");
);
// xColとyColから値を抽出します
xValues = xCol << Get Values; // xColの値を取得します
yValues = yCol << Get Values; // yColの値を取得します
// R に送信される値を表示します (デバッグ用)
表示(xValues);
表示(y値);
// R接続を初期化する
R 初期化();
// xColとyColの値を数値ベクトルとしてRに送信します
R 送信(xValues);
R 送信(y値);
// 外部のRスクリプトを実行する
R ファイルを送信します ( "C:/Users/NDS/Data_Ana.R" );
// プロットを取得する
R 送信( "print(plot1)" );
R 送信( "print(plot2)" );
// R接続を終了する
//R 用語();
自動化とスクリプトデータの探索と視覚化ウィンドウズRe: JSL/JMP による R プロットおそらく、Wait() や、画像をキャプチャしたり新しい JMP ウィンドウに画像を表示したりするコードが介在していないため、プロット 2 がプロット 1 を即座に置き換えているのがわかります。R の plot() を実行すると、JMP ウィンドウではなく R ウィンドウが表示されるため、2 番目のプロット コマンドを実行すると、最初のプロットが上書きされます。参照したリンクから、R Get Graphics() のセクションを参照してください。
次のようなことを試してみてください
...
R Submit("print(plot1)");
New Window("Plot 1", Picture Box( R Get Graphics(png) ) );
R Submit("print(plot2)");
New Window("Plot 2", Picture Box( R Get Graphics(png) ) );
...
ヘルプメニューの下にあるJMPのスクリプト索引の例をご覧になりましたか。以下のスクリプトは、スクリプト索引「R Get Graphics」からのものです。
Names Default To Here( 1 );
R Init();
R Submit( "plot(1:10)" );
plot = R Get Graphics( png );
New Window( "Plot", Picture Box( plot ) );
R Term();
Re: JSL/JMP による R プロットこんにちは、ポールさん。回答ありがとうございます。R ではなく Python で同じプロセスを繰り返そうとしています。
そして、JSL は正しい図をプロットする代わりに、Python から最後に定義されたプロットを読み込み続けます。
plt.show(plt.figure(plot1)) は Python では機能しますが、以下のコードを JSL で使用すると:
plot1 = Picture Box(Python Get Graphics("png","plt.show(plt.figure(plot1)"));
その後、JSL は最後に定義されたプロットを取得し続けます。
私が何を間違っているのか、何かアドバイスはありますか?
Re: JSL/JMP による R プロットまず、スクリプト インデックスのドキュメントから、構文: image = Python Get Graphics( format );
2 番目のパラメータはありません。スクリプト インデックスの説明には、次のように記載されています: format パラメータで指定されたグラフィック形式で、Python グラフ表示ウィンドウに書き込まれた最後のグラフィック オブジェクトを返します。
次に、 JMP 18 より前のバージョンの JMP を使用する必要があります。
Python Get Graphics(png); は 18 で非推奨となり、JMP 19開発ビルドからすでに削除されています。JMP 18 では、値を返さず、代わりに警告ダイアログを表示します。JMP のすべてのバージョンで適切な方法は、Python コードで画像をファイルに保存することです。次に、ファイルを Open() して、それを JSL Picture Box() に渡します。JMP 18 の Python Get Graphics() のスクリプト インデックスには、回避策の完全な例が記載されています。
plt.show()を実行する代わりに
次のことを実行する必要があります:
# save image to location of your choosing
plt.savefig( jmp.TEMP + 'get_graphics_img.png') # JMP 18+
# or ... savefig( '/tmp/get_graphics_img.png') before JMP 18 (macOS).
次に、JSLから:またはPythonからjmp.run_jsl(''' ... '''')経由で
// plot = Python Get Graphics( png ); // DEPRECATED
pngJMP = New Window( "Plot", Picture Box( Open( "$TEMP/get_graphics_img.png", png ) ) );
Python Submit( "plt.close()" );
rc = Delete File( "$TEMP/get_graphics_img.png" );
他にも問題があります。特に Mac で実行している場合、matplotlib が対話的に起動されると、matplotlib と JMP はウィンドウ イベント ループの制御を争うことになります。画面に表示されている最後の matplotlib ウィンドウを閉じると、JMP を終了できます。これは matplotlib バックエンドに依存しますが、macOS では特に厄介です。