Comment appeler plot dans une boucle

Fermé
sarah - 5 avril 2010 à 16:08
 sarah - 10 avril 2010 à 12:14
Bonjour tous le monde

s'il vous plait j'ai un probleme que je cherche à resoudre depuit deux jour et je trouve pas de solution.
je travaille sous LINUX je veut utilisé gnuplot pour afficher le contenue de plusieur fichier dans une seul sortie mais je n'arrive pas à fair une boucle. voici le code que j'ai écrit


FILE* f1;
if (NULL == (f1 = popen("gnuplot","w")))
{
perror("gnuplot");
pclose(f1);
return 1;
}


puts("\n Connexion à gnuplot: afficher les clusters\n");
fprintf(f1," set xlabel 'Coordonnées x de chaque objet ' \n");
fprintf(f1," set ylabel 'rdonnées y de chaque objet'\n");
fprintf(f1," set title 'la liste des cluster formé' \n");

fprintf(f1,"set term post enh color \n");
fprintf(f1,"set out 'Clusters.eps'\n"); // with bounding boxes
fprintf(f1,"unset multiplot \n");
fprintf(f1,"set multiplot \n");
for(i=0;i<nb_cluster;i++)
{
fprintf(f1,"plot array \n");
}

sachant que array est une variable (chaine de caractére) qui pérmet de donnée a chaque fois un nom différent pour un fichier puisque je génére mes fichier dans une boucle

s'il vous plait aider moi et merci a l'avance

6 réponses

dubcek Messages postés 18779 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 13 avril 2025 5 630
5 avril 2010 à 17:01
hello
si array est un tableau de char *:
fprintf(f1,"plot %s \n", array[i])
1
Bonsoir,
je vous remerci beaucoup Dubcek mais mon probléme n'est pas encore réglé. je pense que je n'est pas bien expliquée. puisque moi j'ai un ensemble de fichiers exp {Cluster00,Cluster01,....} alors je met l'ensemble de ces noms de fichiers dans un tableau array ensuite j'essaye d'appeler la commande plot dans une boucle bon j'aurai pu eviter d'utiliser la boucle si je connais au préalable le nombre de fichier que j'ai mais ce n'est pas le cas. j'ai essayer ce que vous m'avez dit et j'ai des erreurs:

voici le code que j'ai tapée:

# include <stdio.h>

int main (void)
{
char array[100];
int i;
array[0]="Cluster00";
array[1]="Cluster01";
array[2]="Cluster02";


FILE* f1;
if (NULL == (f1 = popen("gnuplot","w")))
{
perror("gnuplot");
pclose(f1);
return 1;
}
puts("\n Connexion à gnuplot: afficher les clusters\n");
fprintf(f1," set xlabel 'Coordonnées x de chaque objet ' \n");
fprintf(f1," set ylabel 'rdonnées y de chaque objet'\n");
fprintf(f1," set title 'la liste des cluster formé' \n");

fprintf(f1,"set term post enh color \n");
fprintf(f1,"set out 'Clusters.eps'\n"); // with bounding boxes
fprintf(f1,"unset multiplot \n");
fprintf(f1,"set multiplot \n");
for(i=0;i<3;i++)
{
fprintf(f1,"plot %s \n", array[i]);
}
return 0;
}

et voici les erreurs que j'ai apprés la compélation:

essa1.c:9: warning: assignment makes integer from pointer without a cast
essa1.c:10: warning: assignment makes integer from pointer without a cast
essa1.c:11: warning: assignment makes integer from pointer without a cast
0
dubcek Messages postés 18779 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 13 avril 2025 5 630
Modifié par dubcek le 6/04/2010 à 11:06
char array[100]; défini un tableau de 100 chars, pas de 100 chaines.
essayer
char *array[]={"Cluster00", "Cluster01", "Cluster02"};

ou fabriquer les noms:
char array[100];
...
for(i=0;i<3;i++)
{
sprintf(array, "plot Cluster%02d", i);
fprintf(f1, "%s\n", array);
...
0
Salut Dubcek je te remercie je pense que vous avez comprit mon probleme mais j'arrive pas toujours à le regler, j'ai essayer ce que tu ma dit mais ca n'as pas marcher, j'ai aussi essayer ceci :


for(i=0;i<3;i++)
{
fprintf(f1,"plot %s \n", tableau[0]);
}

voici le code complet:

# include <stdio.h>

int main (void)
{
char* tableau[50];
int i;
tableau[0] = "Cluster00";
tableau[1] = "Cluster01";
tableau[2] = "Cluster02";

FILE* f1;
if (NULL == (f1 = popen("gnuplot","w")))
{
perror("gnuplot");
pclose(f1);
return 1;
}


puts("\n Connexion à gnuplot: afficher les clusters\n");
fprintf(f1," set xlabel 'Coordonnées x de chaque objet ' \n");
fprintf(f1," set ylabel 'rdonnées y de chaque objet'\n");
fprintf(f1," set title 'la liste des cluster formé' \n");

fprintf(f1,"set term post enh color \n");
fprintf(f1,"set out 'Clusters.eps'\n"); // with bounding boxes
fprintf(f1,"unset multiplot \n");
fprintf(f1,"set multiplot \n");
for(i=0;i<3;i++)
{
fprintf(f1,"plot %s \n", tableau[0]);

}

return 0;
}

il me donne en sorie un fichier vide et il m'affiche lors de l'exécution les erreurs suivantes:
Undefined variable Cluster00

Undefined variable Cluster01

Undefined variable Cluster02

je te remercie beaucoup et j'atend toujours la reponse
0
dubcek Messages postés 18779 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 13 avril 2025 5 630
9 avril 2010 à 07:14
ce code fonctionne, mais c'est gnuplot qui génère ces erreurs ?
as-tu essayé tes commandes manuellement dans gnuplot
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
9 avril 2010 à 08:24
Salut.
Comme le remarque dubeck, je pense que l'erreur vient de Gnuplot
Si Cluster00 et cie sont des fichiers, il faut faire :
fprintf(f1,"plot '%s' \n", tableau[0]);
ou
fprintf(f1,"plot \"%s\" \n", tableau[0]);

De plus, les commandes pour le multiplot me semblent un peu légère. Il me semble qu'avant chaque appel à plot il faut spécifier les "coordonnées" du sous graphique. Si tu veux superposé les graphiques, n'utilise pas multiplot, mais utilise "replot" à la place de "plot".
Bonne chance.
0
Salut,

je vous remercie char Snipeur et Dubcec, vous m'avez beaucoup aider, mon probléme et présque résolu, dans le shell tous marche tres bien le probleme et quant je passe à ecrire dans un programe C. maintenant j'ai utilisé replot et ca ma données le resultat voulu méme en ecrivant dans un programme C. Le seul probléme qui me réste et que à la fin il me génére un seul fichier qui contient 3 image. la premiére represente le Cluster00 tous seul, la deuxiéme represente le Cluster00 et le Cluster01 et la troisiéme représente les trois clusters. bon c'est pas grave l'essentiel j'ai la troisieme qui me donne les trois clusters, mais j'aime bien avoir que la troisieme image, ya t'il as moyen pour l'avoir?

je vous remercie encore.
0
j'ai oublier de donner le code que j'ai utilisé peut etres il vas sérvir pour aider quelqu'un d'autre

au lieu de faire dans le code précident.
for(i=0;i<3;i++)
{
fprintf(f1,"plot %s \n", tableau[0]);
}

j'ai ecrit tous simplement :

fprintf(f1,"plot '%s' \n", tableau[0]);

for(i=1;i<3;i++)
{
fprintf(f1,"replot '%s' \n", tableau[i]);
}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
9 avril 2010 à 12:02
déplace la ligne fprintf(f1,"set out 'Clusters.eps'\n"); à la fin de la boucle :
fprintf(f1,"plot '%s' \n", tableau[0]);

for(i=1;i<3;i++)
{
fprintf(f1,"replot '%s' \n", tableau[i]);
}
fprintf(f1,"set out 'Clusters.eps'\n");
fprintf(f1,"replot\n");
Je pense que ça fonctionnera.
0
Merci Char Snipeur j'ai essayer ton code mais la sortie que j'ai 'Clusters.eps' je ne peut pas l'ouvrir. en faite j'ai un autre probléme quant j'ai inserer l'ancien code qui marche tous seul, dans mon application j'ai des problémes bon le contenu de mes fichier {Cluster00,Cluster01,..} je les génere au fur et à mesure dans mon code, quant je términe complétement de genérer le contenu de mes fichier je sort de la boucle et j'essaye de représenter les resultats en utilisant le code précident mais il m'affiche les erreur suivants
warning: unreadable file "(null)"
No data in plot
replot 'Cluster02'
no previous plot..
malgré que je sais qu'a cette etape mes fichiers sont bien générer. j'ai met un sleep avant d'insérer le code qui permet d'appelet gnuplot mais c'est pareil.
j'espere que vous avez une aidée pour ça merci beaucoup
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
9 avril 2010 à 14:13
As tu bien fermé tes fichiers ?
Si ma méthode ne fonctionne pas, il faut remodifier ta boucle ainsi :
fprintf(f1,"plot '%s' \\\n", tableau[0]);

for(i=1;i<3;i++)
{
fprintf(f1,", '%s'\\ \n", tableau[i]);
}
0
merci Char Snipeur ton code marche tres bien, mais pour l'autre probléme j'ai vérifier la fermeture de tous mes fichiers j'ai essayer directement
fprintf(f1,"plot 'Cluster00','Cluster01','Cluster03'"); dans mon application au lieux de la boucle et ça marche tres bien, j'ai essayer le nouveau code que tu ma donné dans mon application il me donne en résultat que le Cluster02 ? et il m'affiche l'erreur suivante:
warning: skiping unreadable file "(null)"
malgré que j'affiche le contenu du tableau[0] ,tableau[1]et tableau[2] qui me donne effectivement Cluster00, Cluster01 et Cluster02. je vois pas il est ou le probléme
j'espere que tu aura une idée our mon probléme je te remercie encore
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
Modifié par Char Snipeur le 9/04/2010 à 15:28
remet ton code complet.
fait un printf en parallèle de tes fprintf pour vérifier ce qui est écrit.
Ho ! et puis j'ai opublié dans le dernier truc que je t'ai donné, il faut mettre fprintf(f1,"\n"); après la boucle.
Une autre solution pour faire tout ça, c'est décrire dans un fichier régulier et de demander à Gnupliot de charger ce fichier.
0
mon application contien plus de mille ligne de code pour cela je te donne une portion; mais j'ai pas comprit ta remarque:
"fait un printf en parallèle de tes fprintf pour vérifier ce qui est écrit."

for(i=0;i<(dd-1);i++)
{

........ya plusieur ligne de code ici ou a chaqiue etape de la boucle je calcle le debut et la fin de cluster

if((fincluster-debutcluster)>=MinPts)
{
nb_cluster=nb_cluster+1;
h4=debutcluster;
OrderFile= fopen("OrderFile.txt", "r");
for(h6=0;h6<h4;h6++)
{
fscanf(OrderFile, "%d %f",&b21,&b31);
}
//printf("\n voici le premier cluster \n ");
for(h4=debutcluster;h4<=fincluster;h4++)
{
fscanf(OrderFile, "%d %f",&b21,&b31);
fichier= fopen("test.txt", "a+");
for(h5=0;h5<=nb_ligne;h5++)
{
fscanf(fichier, "%f %f",&b22,&b23);
if(h5==b21)
{
break;
}
}
fclose(fichier);
Cluster_Rep= fopen("Cluster_Rep.txt", "a+");
fprintf(Cluster_Rep, " %f %f\n",b22,b23);
fclose(Cluster_Rep);
}

fclose(OrderFile);
}

array[7] = (char)(tens + '0');
array[8] = (char)(ones + '0');
rename("Cluster_Rep.txt",array);

tableau[nb_cluster]=array;
printf("tableau[nb_cluster] %s",tableau[nb_cluster]);

if(ones==9)
{
ones=0;
tens=tens+1;
}
else
{
ones=ones+1;
}

}

//--------------------- Représentation des Clusters avec Gnuplot


FILE* f1;
if (NULL == (f1 = popen("gnuplot","w")))
{
perror("gnuplot");
pclose(f1);
return 1;
}


puts("\n Connexion à gnuplot: afficher les clusters\n");
fprintf(f1," set xlabel 'Coordonnées x de chaque objet ' \n");
fprintf(f1," set ylabel 'rdonnées y de chaque objet'\n");
fprintf(f1," set title 'la liste des cluster formé' \n");

fprintf(f1,"set term post enh color \n");
fprintf(f1,"set out 'Clusters.eps'\n"); // with bounding boxes


//fprintf(f1,"plot 'Cluster00','Cluster01','Cluster02' \n");

fprintf(f1,"plot '%s' \\\n", tableau[0]);

for(i=1;i<nb_cluster;i++)
{
fprintf(f1,", '%s' \\\n", tableau[i]);
}

//------------------------------------------------------FIN---------------------------------

je te remercie beaucoup pour tes réponses.
0
dubcek Messages postés 18779 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 13 avril 2025 5 630
10 avril 2010 à 07:39
pour
imcompatible implicit declaration of build-in function 'strlen'
imcompatible implicit declaration of build-in function 'strcpy'

placer au début du fichier
#include <string.h>
0
Salut,
Merci Dubcek, Merci Char Snipeur vous m'avez beaucoup aidé, mon probléme est complétement résolut.
0