Appel de gnuplot a partir d'un prog en c++

Messages postés
16
Date d'inscription
lundi 24 juillet 2006
Statut
Membre
Dernière intervention
6 septembre 2006
-
Messages postés
3
Date d'inscription
vendredi 2 mars 2007
Statut
Membre
Dernière intervention
27 juin 2007
-
bonjour,


je vous explique un peu la situation: j'ai un fichier .txt avec
plusieurs colonnes et j'aimerai faire un graphe des colonnes 2,3
etc  en fonction de la colonne 1...

D'apres les quelques recherches que j'ai faite, il faudrait que j'utilise 'using' dans la syntaxe gnuplot.

J'aimerai donc savoir comment je peux directement appeler gnuplot a
partir d'un programme c++ pour que l'afficahge du graphe se fasse
directement à l'execution du programme.

Il me semble qu'il faut utiliser la fonction 'system' mais je n'en suis pas sur


Si quelqu'un peut m'aider...

12 réponses

Messages postés
492
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2012
1
Oui, c'est ca; tu dois utiliser system.

Essaye deja de trouver la bonne ligne de commande en la tappant
directement dans la console, une fois que tu la trouver, tu l'appel
dans ton prog avec system :


system("gnuplot argument");

TuRn3r
Messages postés
16
Date d'inscription
lundi 24 juillet 2006
Statut
Membre
Dernière intervention
6 septembre 2006

ok

et est ce qu'il est possible de faire varier une variable dans l'argument

Par la je veux dire, j'ai un fichier avec plusieurs colonnes.

Pour faire le graphe de la colonne 2 en fonction de la colonne 1 j'aurai dans l'argument quelque chose du genre 'using 1:2'...

serait il alors possible de faire varier le 2 du genre a avoir


for (k=0,k<size,k++)

system('........using 1:k')
Messages postés
492
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2012
1
oui, formatte la chaine avant de l'envoyer

std::stringstream cmd:
for (k=0,k<size,k++)
{
    cmd << "gnuplot using 1:" << k ;

    system(cmd.str.c_str());
}

ou si tu est en C utilise sprintf à la place, l'idée reste la même

TuRn3r
Messages postés
16
Date d'inscription
lundi 24 juillet 2006
Statut
Membre
Dernière intervention
6 septembre 2006

merci pour tes reponses j'essaie ca de suite...

par contre petite question pour comprendre un peu ce que tu m'indiques:

pourquoi le 'size_t' devant k=0,k<size,k++)

qu'est ce que cela signifie


deuxieme petite question: il doit y avoir un en-tete a rajouter pour utiliser stringstream,non


et derniere question: si je me fie a tes dires, la syntaxe de mon programme doit donc etre:


std::stringstream cmd;

for(size_t k=0;k<size;k++)

{

cmd<<"gnuplot plot 'res.txt' using 1:"<<k;


system(cmd.str().c_str());

}


En tout cas merci  beaucoup pour toutes tes indications
Messages postés
492
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2012
1
pourquoi le 'size_t'
--> size_t correspond à un unsigned int, c'est exactement pareil mais plus sourt à écrire (faignantise pure)

deuxieme petite question: il doit y avoir un en-tete a rajouter pour utiliser stringstream,non
--> oui : <sstream>

et derniere question: si je me fie a tes dires, la syntaxe de mon programme doit donc etre:

std::stringstream cmd;
for(size_t k=0;k<size;k++)
{
cmd<<"gnuplot plot 'res.txt' using 1:"<<k;

system(cmd.str().c_str());
}
--> oui mais pourquoi ton fichier est entre ' ', je suis pas sur que ce soit utile (à vérifier néanmoins)

TuRn3r
Messages postés
16
Date d'inscription
lundi 24 juillet 2006
Statut
Membre
Dernière intervention
6 septembre 2006

merci  pour toutes tes indications, je pense arriver a la solution

par contre petit souci:

lorsque j'ecris cmd<<"gnuplot plot 'res.txt' using 1:"<<k

a l'execution, le compilateur me dit qu'il ne trouve pas le fichier
plot, ce qui laisse penser que la déclaration 'gnuplot plot 'res.txt'
using ... n'est pas la bonne...

si quelqu'un sait quelle est la syntaxe a utiliser


merci d'avance
Messages postés
3
Date d'inscription
vendredi 2 mars 2007
Statut
Membre
Dernière intervention
27 juin 2007

je voudrai appeller la fonction gnuplot avec un programme c est ce que tu connais la syntaxe
merci d'avance
Messages postés
492
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2012
1
gp = popen(GNUPLOT_PATH,"w");
if(gp == NULL){
fprintf(stderr, "Oops, I can’t find %s.", GNUPLOT_PATH);
exit(EXIT_FAILURE);
}
fprintf(gp,"reset \n");
fprintf(gp,"set term windows \n");
fflush(gp);
fprintf(gp,"set grid x y \n");
fflush(gp);
fprintf(gp,"set title "Répartition des nombres générés par le pnrg r250 pour %d de tirages" tc lt 0 \n",max_generation);
fflush(gp);
// fprintf(gp,"set xlabel \'Ensemble\' tc lt 0 \n");
// fflush(gp);
fprintf(gp,"set ylabel \'Nombre de tirages \' tc lt 0 \n");
fflush(gp);
fprintf(gp,"set xr [0:1]\n");
fflush(gp);
fprintf(gp,"set yr [0:%d]\n",(int)(1.2*max_generation/nbr_case));
fflush(gp);
fprintf(gp,"set xtics\n");
fflush(gp);
fprintf(gp,"set ytics\n");
fflush(gp);
fprintf(gp,"plot \'%s\' u 1:2 title "" with boxes fs solid 0.7\n",fp1);
fflush(gp);
fprintf(gp,"set nokey \n");
fflush(gp);
fprintf(gp,"set label "{/Symbol c}^2 = %f" tc lt 16 at 0.1,%d \n",chi_2,(int)(1.1*max_generation/nbr_case));
fflush(gp);
fprintf(gp,"set label "dl = %d" tc lt 16 at 0.4,%d \n",
(int)(nbr_case-1),(int)(1.1*max_generation/nbr_case));
fflush(gp);
fprintf(gp,"set label "{/Symbol c}^{2}_{crit}(%d,%1.2f)= %3.3f" at 0.65,%d\n",
(int)(nbr_case-1.),0.05,123.54,
(int)(1.1*max_generation/nbr_case));
fflush(gp);
fprintf(gp,"set encoding iso_8859_1 \n");
fflush(gp);
fprintf(gp,"set term post eps landscape enhan mono "Times-Roman" 18 \n");
fflush(gp);
fprintf(gp,"set output "%s.eps"\n",fp2);
fflush(gp);
fprintf(gp,"replot\n");
fflush(gp);
getchar();
fprintf(gp,"reset\n");
fflush(gp);
fclose(gp);








TuRn3r
Messages postés
3
Date d'inscription
vendredi 2 mars 2007
Statut
Membre
Dernière intervention
27 juin 2007

en fait je suis sous linux et dans le terminal je tape gnuplot toto.gnuplot pour afficher un champs de vecteur, j'aimerai que cette commande se fasse a partir de mon progamme c.
Messages postés
492
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2012
1
int main ()
{
...
 
// AFFICHAGE GRAPHQUE:
f = popen("gnuplot", "w");

// execution de la commande gnuplot
fprintf(f, " plot "toto.gnuplot" with lines\n");

fflush(f);

// terminer l'envoi de commande et fermer gnuplot
sleep (10000);
pclose(f);

return0;
}
 








TuRn3r
Messages postés
3
Date d'inscription
vendredi 2 mars 2007
Statut
Membre
Dernière intervention
27 juin 2007

je te remerci ça m'a aidé à mieux comprendre popen
Messages postés
492
Date d'inscription
samedi 10 juillet 2004
Statut
Membre
Dernière intervention
12 janvier 2012
1
oui, tu es en C++, j'avias pas vu, fais ca ca devrai marcher (si la syntaxe est bonne)

std::stringstream cmd;
for (size_t k=0, k<size, k++)
{
    cmd << "gnuplot using 1:" << k ;

    system(cmd.str().c_str());
}

TuRn3r