通过 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);
Include("Dialog_script.jsl"); // 加载对话框以获取选定的 X 和 Y 列
dt = Current Data Table(); // 获取当前数据表
// 从数据表中获取选定的 X 和 Y 列
xCol = 列(dt,xColName[1]);
yCol = 列(dt, yColName[1]);
// 检查列是否存在
如果(xCol == Empty() | yCol == Empty(),
Throw("错误:所选的列在数据表中不存在。");
(英文):
// 从 xCol 和 yCol 中提取值
xValues = xCol << Get Values; // 获取 xCol 的值
yValues = yCol << Get Values; // 获取 yCol 的值
// 显示发送到 R 的值(用于调试)
显示(xValues);
显示(y值);
// 初始化 R 连接
R 初始化();
// 将 xCol 和 yCol 的值作为数字向量发送到 R
R 发送(x值);
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 窗口,因此当您运行第二个 plot 命令时,它会覆盖第一个图。从您引用的链接中,请参阅 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 图绘制嗨,Paul,谢谢你的回答。我正在尝试用 Python 而不是 R 重复同样的过程。
并且 JSL 继续从 Python 加载最后定义的图,而不是绘制正确的图形。
plt.show(plt.figure(plot1)) 在 Python 中有效,但是当我在 JSL 中使用下面的代码时:
plot1 = 图片框(Python 获取图形(“png”,“plt.show(plt.figure(plot1)”));
然后 JSL 继续采用最后定义的图。
您对我做错的事情有什么建议吗?
回复:通过 JSL/JMP 进行 R 图绘制首先,从脚本索引中的文档中,语法:image = Python Get Graphics(format);
没有第二个参数。脚本索引描述指出:以 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 上尤其棘手。