Mode d'emploi et manuel de référence

Previous Up

2.11  Tracés élémentaires

Comme eepic.sty peut tracer des droites de longueurs et de pentes arbitraires, les courbes peuvent être approximées en reliant des points par des segments. ePiX restitue de cette manière les courbes, les polygones et les graphes6 de fonction.

Pour l'instant, « fonction» signifie « fonction d'une variable» – précisément une fonction à variable double et à valeur double. Un graphe de fonction dépend du domaine et du nombre de points à utiliser. Chaque commande

  plot(f, t_min, t_max, n);
  polarplot(f, t_min, t_max, n);
  shadeplot(f, t_min, t_max, n);

trace le graphe de la fonction f sur l'intervalle [t_min, t_max] en divisant cet intervalle en n sous-intervalles d'amplitudes égales. La première donne un graphe dans un repère cartésien, la deuxième dans un repère polaire dont les bornes sont données dans l'unité d'angles courante. Si deux fonction sont passées à shadeplot la région qu'elles délimitent est colorée.

Représentation de données

On peut créer des fichiers de données numériques, les manipuler, les analyser, les représenter graphiquement (chemins, nuages de points et histogrammes), les lire et les écrire. Un fichier de données doit contenir un ou plusieurs nombres en point flottant7 avec le même nombre d'entrées par ligne. Tout ce qui apparait sur une ligne après le caractère % de commentaire de LATEX est considéré comme un commentaire.

ePiX fournit deux types de commande plot (tracer) pour les fichiers de données. La première facilite la représentation graphique de colonnes choisies, la deuxième simplifie la représentation graphique des deux première colonnes avec une ou deux échelles logarithmique. On peut utiliser l'une ou l'autre forme pour tracé dans une échelle logarithmique des colonnes sélectionnées.

Supposons que mydata.dat contienne au moins 5 colonnes. Les commandes

  plot("mydata.dat", DOWN);
  plot("mydata.dat", PLUS, log_lin);
  plot("mydata.dat", SPOT, 2, 4, 5, sph);

représente (pour la première) graphiquement les deux premières colonnes de mydata.dat en plaçant un « ▽ » à chaque point ; marque (la 2) les points définis par les deux premières colonnes avec un « +» dans un repère semi-logarithmique, l'axe des abscisses portant l'échelle logarithmique ; extraie (la troisième) les 2, 4et 5colonnes du fichier et les traite comme donnant des coordonnées sphériques de points qui sont représentés par un « •».

Les commandes générales, avec leurs arguments optionnels entre crochets, lisent les nombres de deux ou trois colonnes d'un fichier spécifié, les passent comme arguments à une fonction F à valeur P et tracent les points ainsi déterminés :

  plot("filename", STYLE, [i_1], [i_2], [i_3], [F]);
  plot("filename", STYLE, F, [i_1], [i_2], [i_3]);

Le premier argument est le nom du fichier de données. Le STYLE peut être PATH, qui relie les points dans leur ordre d'apparition, ou n'importe quel type de marques de la table 2.1. Les entiers ik spécifient les colonnes d'où doivent être extraites les données, par défaut il s'agit de la 1, de la 2colonne et de zéro (une colonne de zéros). Si le « système de coordonnées» F est omis dans la première commande, il prend la valeur par défaut du constructeur de point cartésien. La fonction F est obligatoire dans la deuxième forme ; des choix utiles comprennent log_log, log_lin et lin_log qui représentent les coordonnées correspondantes sur une échelle logarithmique.

data_file

Pour des analyse plus élaborées, la classe data_file (fichier_de_données) fournit une interface qui permet de voir un fichier comme une liste de colonnes. Il y a deux manières principales de créer un data_file : par lecture dans un fichier externe ou par création de données (jusqu'à trois colonnes) à l'aide de fonctions à valeur double. Dans les constructeurs ci-dessous, chaque fonction fi est une fonction d'une variable à valeur double.

  data_file DF("my_data"); // lit les données dans un fichier
  data_file DF(f1, t_min, t_max, num_pts); // valeurs de f1
  data_file DF(f1, f2, t_min, t_max, num_pts);
  data_file DF(f1, f2, f3, t_min, t_max, num_pts);
  data_file DF(3);  // crée un data_file vide de 3 colonnes
  DF.read("file1").read("file2"); // lit deux fichiers

Une fois qu'un data_file existe, ses colonnes peuvent être transformées par l'application d'une fonction définie par l'utilisateur ; on peut en calculer la moyenne, les corréler, les extraire (pour utilisation par un autre code), en tracer le nuage de points et les écrire sur un fichier à un endroit spécifié. Ci-dessous, la fonction f est une fonction d'une variable à valeur double et la fonction F est une fonction de deux ou trois variables à valeur P dont les composants sont réécrits dans les colonnes sélectionnées.

  DF.transform(f, 3);    // applique f à col3
  DF.transform(F, 2, 4); // applique F à col2, col4
  double t(DF.dot(3,2)); // t = produit  scalaire de col2, col3
  double av(DF.avg(2));  // av = moyenne de col2
  double v(DF.var(1));   // variance de col1
  double cor(DF.covar(1, 3)); // covariance de col1, col3
  DF.regression(1,3);    // trace la droite de régression

Le nuage de point représentant un data_file est obtenu avec la syntaxe décrite ci-dessus pour les fichiers de données. La sortie est rognée aux dimensions de la boite-cadre.

  DF.plot(STYLE, [i1], [i2], [i3], [F]);
  DF.plot(STYLE, F, [i1], [i2], [i3]);

Un data_file peut être écrit sur le disque comme un fichier de données brutes ou dans un format spécifié. Ci-dessous, fmt représent une fonction de deux variables à valeur string (chaine de caractères) et myfile est le nom du fichier à écrire sur le disque.

  DF.precision(4);    // fixe 4 chiffres significatifs
  DF.write("myfile"); // écrit en colonne séparées par des tabulations
  DF.write("myfile", fmt, [i1], [i2]); // applique fmt aux colonnes

On peut extraire une colonne comme un vector (vecteur) de C++ pour l'utiliser avec une autre fonction :

  DF.column(i);    // i-ème colonne
  DF.column(f, i); // i-ème colonne, transformée par f

Histogrammes

Pour permettre la création d'histogrammes adaptables, ePiX fournit la classe data_bins qui modélise un intervalle défini divisé en intervalles à des emplacements spécifiés, non nécessairement espacés régulièrement. La vie d'un data_bins a deux périodes. Dans la première, des « coupures» (extrémités des sous-intervalles) sont ajoutés. Lorsque les données sont lues, les coupures sont « vérouillées» et ne peuvent plus être changées.

  // [xmin, xmax] divisé en n intervalles égaux, n=1 par défaut
  data_bins db(xmin, xmax, [n]);
  db.cut(x);  // ajoute une coupure en x (si x est dans l'intervalle)
  db.read(vector<double>); // lit les données, vérouille les classes
  unsigned int count(db.pop());   // population courante
  db.histogram([c]);// rectangles « réduit » d'un facteur c (1 par défaut)
  db.plot([c]);     // interpolation par spline

La hauteur d'un rectangle de l'histogramme est l'effectif de la classe correspondante ; le comportement était différent dans les versions antérieures.

Cet extrait de code illustre quelques unes des fonctionnalités décrites ci-avant.

  data_file DF("myfile.dat");
  DF.transform(log_log);   // agit sur les 2 premières colonnes
  data_bins db(-6, 4, 20); // [-6, 4], 20 classes
  db.read(DF.column(1));   // lit col1
  db.histogram();

  DF.plot(BOX);            // nuage de pont log-log 
  DF.regression(1, 2);     // trace la droite de régression
  DF.write("log_log.dat"); // écrit un fichier sur le disque


6
Note du TdS : Je sais bien, pour avoir enseigné dans le secondaire, qu'il faudrait dire « représentation graphique» mais, bon…
7
Note du TdS : Il faut utiliser le point décimal et non la virgule.

Previous Up