R-plot tramite JSL/JMPHo questo script come si vede sotto dove calcolo alcune cose semplici in R e dove voglio vedere alcuni grafici in JSL. Non riesco a far sì che JSL mostri i due grafici. Quando eseguo il codice qui sotto, chiude plot1 e mostra solo il grafico due. Ho provato a usare quanto descritto qui ( https://community.jmp.com/t5/JMPer-Cable/Getting-started-with-the-JMP-to-R-Interface/ba-p/43920 ) ma non riesco a farlo funzionare. Potrebbe essere un comando semplice ma sono abbastanza nuovo in JSL. Spero che tu possa aiutarmi. Per tua informazione, uso JMP 17.2
I nomi predefiniti sono qui(1);
Include("Dialog_script.jsl"); // Carica la finestra di dialogo per ottenere le colonne X e Y selezionate
dt = Current Data Table(); // Ottieni la tabella dati corrente
// Ottieni le colonne X e Y selezionate dalla tabella dati
xCol = Colonna(dt, xColName[1]);
yCol = Colonna(dt, yColName[1]);
// Controlla se le colonne esistono
Se(xCol == Vuoto() | yCol == Vuoto(),
Throw("Errore: le colonne selezionate non esistono nella tabella dati.");
);
// Estrarre i valori da xCol e yCol
xValues = xCol << Ottieni valori; // Ottieni i valori di xCol
yValues = yCol << Ottieni valori; // Ottieni i valori di yCol
// Mostra i valori inviati a R (per il debug)
Mostra(xValori);
Mostra(yValori);
// Inizializza la connessione R
R Inizializzazione();
// Invia i valori di xCol e yCol a R come vettori numerici
R Invia( xValori );
R Invia( yValues );
// Esegui lo script R esterno
R Invia file( "C:/Utenti/NDS/Data_Ana.R" );
// Recupera la trama
R invia( "stampa(plot1)" );
R invia( "stampa(plot2)" );
// Termina la connessione R
//Termine R();
Automazione e scriptingEsplorazione e visualizzazione dei datiFinestreRe: R-plot tramite JSL/JMPCredo che quello che vedi è che il grafico 2 sostituisce immediatamente il grafico 1, poiché non hai Wait() o codice intermedio per catturare l'immagine o visualizzarla in una nuova finestra JMP. Eseguendo plot() di R ottieni una finestra R, non una finestra JMP, quindi quando esegui il secondo comando plot, sovrascrive il primo grafico. Dal link a cui hai fatto riferimento, vedi la sezione su R Get Graphics().
Prova qualcosa del genere
...
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) ) );
...
Hai guardato gli esempi nell'indice di scripting di JMP, che si trova nel menu Help? Lo script qui sotto proviene dall'indice di scripting '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 tramite JSL/JMPCiao Paul Grazie per la risposta. Sto provando a ripetere lo stesso procedimento solo per Python invece che per R.
E il JSL continua a caricare l'ultimo grafico definito da Python invece di tracciare la figura corretta.
plt.show(plt.figure(plot1)) funziona in Python, ma quando utilizzo il codice seguente in JSL:
plot1 = Picture Box(Python Ottieni grafica("png","plt.show(plt.figure(plot1)"));
Quindi JSL continua a prendere l'ultimo grafico definito.
Puoi suggerirmi cosa ho sbagliato?
Re: R-plot tramite JSL/JMPInnanzitutto, dalla documentazione nell'indice degli script, sintassi: image = Python Get Graphics( format );
Non c'è un secondo parametro. La descrizione dell'indice di scripting afferma: Restituisce l'ultimo oggetto grafico scritto nella finestra di visualizzazione del grafico Python in un formato grafico specificato dal parametro format.
In secondo luogo, è necessario utilizzare una versione di JMP precedente a JMP 18.
Python Get Graphics(png); è stato deprecato in 18, e già rimosso dalle build di sviluppo di JMP 19. In JMP 18 non restituisce un valore, ma solleva invece una finestra di dialogo di avviso. Il modo appropriato che sarà in tutte le versioni di JMP, è di far sì che il codice Python salvi l'immagine in un file. Quindi Open() il file e passarlo a un JSL Picture Box(). L'indice di scripting di JMP 18 per Python Get Graphics() fornisce un esempio completo della soluzione alternativa.
Invece di fare un plt.show()
dovresti fare:
# 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).
Quindi da JSL: o tramite jmp.run_jsl(''' ... '''') da 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" );
C'è un altro problema. Soprattutto se eseguito su Mac, matplotlib e JMP lottano per il controllo sul ciclo di eventi della finestra se matplotlib viene attivato in modo interattivo. Puoi ottenere un'uscita da JMP chiudendo l'ultima finestra matplotlib visibile sullo schermo. Ciò dipende dal backend matplotlib, ma è particolarmente pignolo su macOS.