透過 JSL/JMP 繪製 R 繪圖我有這個腳本,如下所示,我在 R 中計算了一些簡單的內容,我想在 JSL 中查看一些圖。我無法讓 JSL 顯示這兩張圖。當我運行下面的程式碼時,它會關閉圖 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);
包含(“Dialog_script.jsl”); // 載入對話方塊以取得選定的 X 和 Y 列
dt = 當前資料表(); // 取得目前資料表
// 從資料表中取得選定的X和Y列
xCol = 列(dt, xColName[1]);
yCol = 列(dt, yColName[1]);
// 檢查列是否存在
如果(xCol == 空() | yCol == 空(),
Throw("錯誤:資料表中不存在所選列。");
);
// 從 xCol 和 yCol 中提取值
xValues = xCol << 取得值; // 取得xCol的值
yValues = yCol << 取得值; // 取得 yCol 的值
// 顯示傳送到 R 的值(用於偵錯)
顯示(x值);
顯示(y值);
// 初始化R連接
R 初始化();
// 將 xCol 和 yCol 的值作為數值向量傳送到 R
R 發送(xValues);
R 發送( yValues );
// 執行外部R腳本
R 提交文件( "C:/Users/NDS/Data_Ana.R" );
// 檢索繪圖
R 提交(“列印(plot1)”);
R 提交(“列印(plot2)”);
// 終止R連接
//R 術語();
自動化和腳本編寫數據探索和視覺化視窗回覆:透過 JSL/JMP 進行 R 繪圖我相信您所看到的是圖 2 立即替換了圖 1,因為您沒有中間的 Wait() 或程式碼來擷取影像或在新的 JMP 視窗中顯示影像。在執行 R 的plot() 時,您將獲得一個 R 窗口而不是 JMP 窗口,因此當您執行第二個繪圖命令時,它會覆寫第一個繪圖。從您引用的連結中,請參閱 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();
回覆:透過 JSL/JMP 進行 R 繪圖你好,保羅,謝謝你的回答。我正在嘗試為 Python 而不是 R 重複相同的過程。
並且 JSL 不斷從 Python 載入最後定義的繪圖,而不是繪製正確的圖形。
plt.show(plt.figure(plot1)) 在 Python 中工作,但是當我在 JSL 中使用以下程式碼時:
圖1 = 圖片框(Python 取得圖形("png","plt.show(plt.figure(plot1)"));
然後 JSL 繼續取得最後定義的圖。
你對我做錯了什麼有什麼建議嗎?
回覆:透過 JSL/JMP 進行 R 繪圖首先,根據腳本索引中的文檔,語法: image = Python Get Graphics( format );
沒有第二個參數。腳本索引描述指出:以 format 參數指定的圖形格式傳回寫入 Python 圖形顯示視窗的最後一個圖形物件。
其次,您必須在 JMP 18 之前使用 JMP。
Python 取得圖形(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 上尤其挑剔。