Gráfico R a través de JSL/JMPTengo este script como se ve a continuación, donde calculo algunos cálculos simples en R y donde quiero ver algunos gráficos en JSL. No puedo lograr que JSL muestre los dos gráficos. Cuando ejecuto el código a continuación, cierra el gráfico 1 y solo muestra el gráfico 2. He intentado usar lo que se describe aquí ( https://community.jmp.com/t5/JMPer-Cable/Getting-started-with-the-JMP-to-R-Interface/ba-p/43920 ), pero no puedo lograr que funcione. Puede ser un comando simple, pero soy bastante nuevo en JSL. Espero que puedas ayudar. Para tu información, uso JMP 17.2
Los nombres predeterminados están aquí (1);
Include("Dialog_script.jsl"); // Cargar el cuadro de diálogo para obtener las columnas X e Y seleccionadas
dt = Tabla de datos actual(); // Obtener la tabla de datos actual
// Obtener las columnas X e Y seleccionadas de la tabla de datos
xCol = Columna(dt, xColName[1]);
yCol = Columna(dt, yColName[1]);
// Verificar si existen columnas
Si (xCol == Vacío() | yCol == Vacío(),
Throw("Error: Las columnas seleccionadas no existen en la tabla de datos.");
);
// Extrae los valores de xCol y yCol
xValues = xCol << Obtener valores; // Obtener los valores de xCol
yValues = yCol << Obtener valores; // Obtener los valores de yCol
// Muestra los valores que se envían a R (para depuración)
Mostrar(xValores);
Mostrar(yValues);
// Inicializar la conexión R
R Init();
// Envía los valores de xCol e yCol a R como vectores numéricos
R Enviar( xValores );
R Enviar( yValores );
// Ejecutar el script R externo
R Enviar archivo("C:/Users/NDS/Data_Ana.R" );
// Recuperar la trama
R enviar("imprimir(plot1)" );
R enviar("imprimir(plot2)" );
//Terminar la conexión R
//Término R();
Automatización y scriptingExploración y visualización de datosVentanasRe: R-plot a través de JSL/JMPCreo que lo que estás viendo es que el gráfico 2 reemplaza inmediatamente al gráfico 1, ya que no tienes ningún comando Wait() intermedio ni código para capturar la imagen o mostrar la imagen en una nueva ventana JMP. Al ejecutar el comando plot() de R, obtienes una ventana R, no una ventana JMP, por lo que cuando ejecutas el segundo comando plot, sobrescribes el primer gráfico. En el enlace al que haces referencia, consulta la sección sobre R Get Graphics().
Prueba algo como
...
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) ) );
...
¿Ha consultado los ejemplos en el índice de secuencias de comandos de JMP, que se encuentra en el menú Ayuda? La secuencia de comandos que aparece a continuación proviene del índice de secuencias de comandos '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: R-plot a través de JSL/JMPHola Paul, gracias por tu respuesta. Estoy intentando repetir el mismo proceso, pero para Python en lugar de R.
Y el JSL sigue cargando el último gráfico definido desde Python en lugar de trazar la figura correcta.
El plt.show(plt.figure(plot1)) funciona en Python, pero cuando uso el código a continuación en JSL:
plot1 = Cuadro de imagen(Python Obtener gráficos("png","plt.show(plt.figure(plot1)"));
Luego JSL continúa tomando la última gráfica definida.
¿Tienes alguna sugerencia de lo que hice mal?
Re: R-plot a través de JSL/JMPPrimero, de la documentación en el Índice de secuencias de comandos, sintaxis: image = Python Get Graphics( format );
No hay un segundo parámetro. La descripción del índice de secuencias de comandos indica: Devuelve el último objeto gráfico escrito en la ventana de visualización de gráficos de Python en un formato gráfico especificado por el parámetro de formato.
En segundo lugar, debes utilizar JMP anterior a JMP 18.
Get Graphics(png); de Python quedó obsoleto en la versión 18 y ya se eliminó de las compilaciones de desarrollo de JMP 19. En JMP 18 no devuelve un valor, sino que genera un cuadro de diálogo de alerta. La forma adecuada, que se aplicará en todas las versiones de JMP, es que el código de Python guarde la imagen en un archivo. Luego, ejecute Open() en el archivo y lo entregue en un JSL Picture Box(). El índice de scripts de JMP 18 para Get Graphics() de Python brinda un ejemplo completo de la solución alternativa.
En lugar de hacer un plt.show()
Deberías hacer:
# 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).
Luego desde JSL: o a través de jmp.run_jsl(''' ... '''') desde Python
// 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" );
Existe otro problema. Especialmente si se ejecuta en Mac, matplotlib y JMP luchan por el control del bucle de eventos de la ventana si matplotlib se inicia de forma interactiva. Puede salir de JMP cerrando la última ventana de matplotlib visible en la pantalla. Esto depende del backend de matplotlib, pero es especialmente delicado en macOS.