Appel de gnuplot à partir de python
J'ai un script python que l'informatique va générer deux fichiers de données formaté comme gnuplot d'entrée.
Comment faire "appel" gnuplot de python ?
Je veux envoyer le python suivant de la chaîne en entrée de gnuplot:
"plot '%s' with lines, '%s' with points;" % (eout,nout)
où "eout " et " nout' sont les deux noms de fichiers.
PS:
Je préfèrent de ne pas utiliser d'autres modules python (par exemple. gnuplot-py), seule la norme API.
Merci
source d'informationauteur Andrei Ciobanu
Vous devez vous connecter pour publier un commentaire.
Une approche simple peut-être juste écrire un troisième fichier contenant vos commandes gnuplot puis dire à Python pour exécuter gnuplot avec ce fichier. Dire que vous écrivez
à un fichier tmp.gp. Ensuite, vous pouvez utiliser
La
sous-processus
module vous permet d'appeler d'autres programmes:Sous-processus est expliqué très clairement sur Doug Hellemann de l'
Module Python de la Semaine
Cela fonctionne bien:
On pourrait aussi utiliser "communiquer" mais l'intrigue fenêtre se ferme immédiatement, à moins d'un gnuplot pause de commande est utilisé
J'ai essayé de faire quelque chose de similaire, mais en plus, je voulais flux de données à partir de l'intérieur de python et de sortie le graphique fichier comme une variable (donc ni les données ni les graphique sont des fichiers réels). C'est ce que je suis venu avec:
Script vide le graphique sur la sortie standard stdout comme la dernière étape dans principal. L'équivalent de ligne de commande (lorsque le graphe est canalisée vers 'out.gif"):
Voici une classe qui fournit une interface pour wgnuplot.exe:
Je suis un peu en retard, mais depuis qu'il m'a fallu un certain temps pour le faire fonctionner, c'est peut-être la peine de mettre une note. Les programmes de travail avec Python 3.3.2 sur Windows.
Avis que les octets sont utilisés partout, pas des chaînes de caractères (par exemple b"de la parcelle x", et non pas simplement "de la parcelle x"), mais dans ce cas c'est un problème, il suffit de faire quelque chose comme:
Première solution: utiliser communiquer pour envoyer le tout, et se ferment quand c'est fait. Il ne faut pas oublier pauseou la fenêtre est fermée à la fois. Cependant, il n'est pas un problème si gnuplot est utilisé pour stocker les images dans des fichiers.
Deuxième solution: envoyer des commandes l'une après l'autre, à l'aide de stdin.écrire(...). Mais, n'oubliez pas de rincer! (c'est ce que je n'ai pas eu droit à la première) Et l'utilisation mettre fin à pour fermer la connexion et gnuplot quand le travail est terminé.
Je suis allé avec Ben suggestion que j'étais le calcul des graphiques à partir d'un céleri travail et a trouvé qu'il serait de blocage lors de la lecture de la sortie standard stdout. J'ai repensé il ressemble tellement à l'aide d'StringIO pour créer le fichier de destination pour l'entrée standard et sous-processus.communiquer pour obtenir immédiatement le résultat via la sortie standard, pas de lecture nécessaire.
Voici un autre exemple qui s'étend sur les réponses précédentes. Cette solution nécessite Gnuplot 5.1car il utilise des blocs de donnée. Pour plus d'informations sur les datablocks, exécuter
help datablocks
dans gnuplot.Le problème avec certaines des approches précédentes est que
plot '-'
instantanément consomme les données qui suit immédiatement la commande plot. Il n'est pas possible de réutiliser les mêmes données dans un complot de la commande. les datablocks peut être utilisé pour pallier ce problème. À l'aide de blocs de donnée on peut imiter plusieurs fichiers de données. Par exemple, vous pouvez tracer un graphique à partir des données de deux fichiers de données, par exempleplot "myData.dat" using 1:2 with linespoints, '' using 1:3 with linespoints, "myData2.dat" using 1:2 with linespoints
. Nous avons pu nourrir ces données directement à gnuplot sans la nécessité de créer des fichiers de données réelles.Cette méthode est un peu plus polyvalent que
plot '-'
comme il est plus facile de réutiliser les mêmes données plusieurs fois, y compris sur la même parcelle de commande: https://stackoverflow.com/a/33064402/895245Notez que cette approche exige que les données sont envoyées à gnuplot avant la parcelle commandes!
Aussi, je n'ai pas utiliser IOString @ppetraki fait, car apparemment c'est plus lent que d'une simple liste de menuisier: https://waymoot.org/home/python_string/