Graphique R via JSL/JMPJ'ai ce script comme indiqué ci-dessous où je calcule des choses simples dans R et où je veux voir des tracés dans JSL. Je n'arrive pas à faire en sorte que JSL affiche les deux tracés. Lorsque j'exécute le code ci-dessous, il ferme plot1 et n'affiche que plot2. J'ai essayé d'utiliser ce qui est décrit ici ( https://community.jmp.com/t5/JMPer-Cable/Getting-started-with-the-JMP-to-R-Interface/ba-p/43920 ) mais je n'arrive pas à le faire fonctionner. C'est peut-être une commande simple, mais je suis assez nouveau dans JSL. J'espère que vous pourrez m'aider. Pour info, j'utilise JMP 17.2
Les noms par défaut sont ici (1) ;
Include("Dialog_script.jsl"); // Charger la boîte de dialogue pour obtenir les colonnes X et Y sélectionnées
dt = Current Data Table(); // Obtenir la table de données actuelle
// Obtenir les colonnes X et Y sélectionnées dans la table de données
xCol = Colonne(dt, xColName[1]);
yCol = Colonne(dt, yColName[1]);
// Vérifier si les colonnes existent
Si(xCol == Vide() | yCol == Vide(),
Throw("Erreur : les colonnes sélectionnées n'existent pas dans la table de données.");
);
// Extraire les valeurs de xCol et yCol
xValues = xCol << Obtenir les valeurs ; // Obtenir les valeurs de xCol
yValues = yCol << Obtenir les valeurs ; // Obtenir les valeurs de yCol
// Afficher les valeurs envoyées à R (pour le débogage)
Afficher(xValues);
Afficher(yValues);
// Initialiser la connexion R
R Init();
// Envoyer les valeurs de xCol et yCol à R sous forme de vecteurs numériques
R Envoyer( xValues );
R Envoyer( yValues );
// Exécuter le script R externe
R Soumettre le fichier( "C:/Users/NDS/Data_Ana.R" );
// Récupérer le tracé
R soumettre( "print(plot1)" );
R soumettre( "print(plot2)" );
// Terminer la connexion R
//Terme R();
Automatisation et scriptsExploration et visualisation des donnéesFenêtresRe: R-plot via JSL/JMPJe pense que ce que vous voyez est que le plot 2 remplace immédiatement le plot 1 car vous n'avez pas de Wait() ou de code intermédiaire pour capturer l'image ou afficher l'image dans une nouvelle fenêtre JMP. En exécutant plot() de R, vous obtenez une fenêtre R et non une fenêtre JMP, donc lorsque vous exécutez la deuxième commande plot, elle écrase le premier plot. À partir du lien auquel vous avez fait référence, consultez la section sur R Get Graphics().
Essayez quelque chose comme
...
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) ) );
...
Avez-vous consulté les exemples dans l'index de scripts de JMP, qui se trouve sous le menu Aide. Le script ci-dessous provient de l'index de scripts « 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 via JSL/JMPBonjour Paul, merci pour votre réponse. J'essaie de répéter le même processus uniquement pour Python au lieu de R.
Et le JSL continue de charger le dernier tracé défini à partir de Python au lieu de tracer la figure correcte.
Le plt.show(plt.figure(plot1)) fonctionne en Python mais lorsque j'utilise le code ci-dessous en JSL :
plot1 = Zone d'image(Python Obtenir des graphiques("png","plt.show(plt.figure(plot1)"));
Ensuite, JSL continue de prendre la dernière parcelle définie.
Avez-vous une suggestion sur ce que j'ai fait de mal ?
Re: R-plot via JSL/JMPTout d'abord, à partir de la documentation de l'index des scripts, Syntaxe : image = Python Get Graphics( format );
Il n'y a pas de deuxième paramètre. La description de l'index de script indique : Renvoie le dernier objet graphique écrit dans la fenêtre d'affichage graphique Python dans un format graphique spécifié par le paramètre format.
Deuxièmement, vous devez utiliser JMP avant JMP 18.
Python Get Graphics(png); a été déconseillé dans la version 18 et a déjà été supprimé des versions de développement de JMP 19. Dans JMP 18, il ne renvoie pas de valeur, mais affiche à la place une boîte de dialogue d'alerte. La méthode appropriée, qui s'appliquera à toutes les versions de JMP, consiste à faire en sorte que le code Python enregistre l'image dans un fichier. Ensuite, ouvrez le fichier et transmettez-le à une boîte d'images JSL(). L'index de script de JMP 18 pour Python Get Graphics() donne un exemple complet de la solution de contournement.
Au lieu de faire un plt.show()
tu devrais faire:
# 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).
Ensuite depuis JSL : ou via jmp.run_jsl(''' ... '''') depuis 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" );
Il y a un autre problème. Surtout si l'exécution est sur Mac, matplotlib et JMP se battent pour le contrôle de la boucle d'événements de fenêtre si matplotlib est lancé de manière interactive. Vous pouvez obtenir une sortie de JMP en fermant la dernière fenêtre matplotlib visible à l'écran. Cela dépend du backend matplotlib, mais c'est particulièrement délicat sous macOS.