Looking for Computer Science  & Information Technology online courses ?
Check my new web site: https://www.yesik.it !

Acheter sur Amazon.fr
 Voir sur Amazon.fr

Le logiciel gnuplot est un utilitaire en ligne de commande permettant de tracer des graphiques en 2 ou 3 dimensions. Les graphiques peuvent être directement affichés à l'écran ou enregistrés sous divers formats bitmap (PNG, JPEG,...) ou vectoriels (EPS, SVG,...). Parce qu'il permet de générer des graphiques de qualité et largement configurables, gnuplot se révèle un outil de choix pour la représentation de données scientifiques. Enfin, puisqu'il utilise un système de script pour décrire le graphique à produire, gnuplot peut être employé partout où des graphiques doivent être générés ou mis à jour automatiquement.

Mais tous ces avantages ont un coût: en effet, malgré un important support sur internet et quelques rares livres, la prise en main de gnuplot reste tout de même ardue. En tout cas, plus que celle d'un logiciel pointe et clique. Pour démystifier un peu la bête, cet article vous montre comment faire vos premiers pas avec gnuplot.

Remarque:

Contrairement à ce que laisse supposer son nom, gnuplot n'a rien à voir avec le projet GNU. En particulier, gnuplot n'est pas distribué sous licence GPL, mais sous sa propre licence.

C'est pour éviter cette confusion que le nom gnuplot doit s'écrire entièrement en minuscule – y compris l'initiale, même en début de phrase [1].

Les bases

Installation

Sous Debian vous aurez besoin du paquet gnuplot pour ce qui suit. Si ce logiciel n'est pas déjà sur votre machine utilisez le gestionnaire de paquets de votre distribution pour procéder à l'installation.

sh# apt-get install gnuplot

Comme beaucoup d'interpréteurs, gnuplot peut être utilisé soit de manière interactive, soit par batch en lui soumettant des scripts. C'est la première option que nous allons tout d'abord utiliser, mais très rapidement, l'utilisation d'un éditeur de texte pour préparer les scripts se révélera plus pratique. Si vous avez convenablement installé gnuplot sur votre système, celui-ci devrait être accessible à partir d'un terminal:

sh$ gnuplot
	G N U P L O T
	Version 4.2 patchlevel 2 
	last modified 31 Aug 2007
	System: Linux 2.6.32-mobal.chicoree.fr

	Copyright (C) 1986 - 1993, 1998, 2004, 2007
	Thomas Williams, Colin Kelley and many others

	Type `help` to access the on-line reference manual.
	The gnuplot FAQ is available from http://www.gnuplot.info/faq/

	Send bug reports and suggestions to <http://sourceforge.net/projects/gnuplot>

Terminal type set to 'wxt'
gnuplot> 

Avant d'aller plus loin, deux commandes à garder en tête et à essayer au plus vite:

help
gnuplot possède une aide en ligne accessible avec la commande help
exit
Vous pouvez quitter l'interpréteur à l'aide de la commande exit ou en tapant CTRL-D (fin de fichier).

gnuplot est un logiciel qui sert à dessiner des graphiques ou tracer des fonctions. Commençons donc par quelque chose de très simple en tapant l'instruction suivante à l'invite de commande:

gnuplot> plot sin(x)

Si vous utilisez gnuplot à partir d'un environnement graphique, cette commande devrait faire apparaître une fenêtre dans laquelle vous pouvez voir le tracé de la fonction sinus.

gnuplot-sinus.png

En environnement graphique, le driver par défaut de gnuplot affiche les graphiques dans une fenêtre. Celle-ci dispose de quelques outils pour explorer le graphique. Essayez, par exemple, d'utiliser le bouton droit de votre souris pour sélectionner une zone sur laquelle zoomer.


Dans cet exemple, la commande plot est utilisée pour tracer une fonction. Laquelle est indiquée à la suite sous la forme d'une expression utilisant la syntaxe habituelle en mathématiques.

Bien entendu, les fonctions pré-définies peuvent être combinées pour tracer toutes les fonctions que vous pouvez souhaiter ou presque:

gnuplot> plot sin(x)/x+cos(2*x)

La liste des fonctions intégrées est celle de la bibliothèque mathématique standard Unix. Sauf que dans gnuplot chaque fonction accepte aussi bien des entiers que des réels ou des nombres complexes.

La commande help functions permet d'obtenir plus d'informations à ce sujet:

gnuplot> help functions
 The functions in `gnuplot` are the same as the corresponding functions in
 the Unix math library, except that all functions accept integer, real, and
 complex arguments, unless otherwise noted.

 For those functions that accept or return angles that may be given in either
 degrees or radians (sin(x), cos(x), tan(x), asin(x), acos(x), atan(x),
 atan2(x) and arg(z)), the unit may be selected by `set angles`, which
 defaults to radians.


Subtopics available for functions:
    abs               acos              acosh             arg
    asin              asinh             atan              atan2
    atanh             besj0             besj1             besy0
    besy1             ceil              column            cos
    cosh              defined           erf               erfc
    exists            exp               floor             gamma
    gprintf           ibeta             igamma            imag
    int               inverf            invnorm           lambertw
    lgamma            log               log10             norm
    rand              random            real              sgn
    sin               sinh              sprintf           sqrt
    strcol            stringcolumn      strlen            strstrt
    substr            system            tan               tanh
    timecolumn        tm_hour           tm_mday           tm_min
    tm_mon            tm_sec            tm_wday           tm_yday
    tm_year           valid             word              words
Subtopic of functions:
gnuplot>

Remarque:

L'aide en ligne dispose d'un système de navigation intégré pour explorer les possibilité de gnuplot. C'est pourquoi à la fin d'un texte d'aide vous aurez la possibilité d'explorer un sous-sujet:

 Subtopic of functions:

Pour quitter l'aide et revenir à l'invite de commande de gnuplot, il suffit de presser return sans rien taper d'autre après cette demande.

Format de sortie

Si la fenêtre graphique est pratique pour expérimenter avec gnuplot ou juger rapidement du résultat d'une commande, en utilisation normale on préfère souvent stocker les tracés produits dans des fichiers.

Il existe de nombreux formats de sortie supportés en standard par gnuplot.
Format de sortie set terminal
PNG (basse qualité) png
PNG (haute qualité) pngcairo
PostScript postscript
PDF pdf
PDF (haute qualité) pdfcairo
SVG svg
...

gnuplot autorise plusieurs formats de fichiers, et utilise le concept de terminal pour permettre de choisir lequel utiliser.

Piège:

Ne confondez pas le terminal dans gnuplot – qui est plus proche du concept de driver – et le terminal (console) dans lequel vous tapez vos commandes.

Ainsi, si vous souhaitez produire un fichier SVG avec le graphique précédent, il va falloir choisir le terminal spécifique, et le nom du fichier de sortie avant d'utiliser le commande de tracé:

gnuplot> set terminal svg # produire un fichier SVG
Terminal type set to 'svg'
Options are 'size 600 480 fixed  fname 'Arial'  fsize 12 butt '
gnuplot> set output 'my-file.svg # nom du fichier de sortie
gnuplot> plot sin(x) # tracé de la courbe

Ici, l'utilisation de la commande plot ne produit aucun résultat visible. Par contre, un nouveau fichier SVG a été créé dans le répertoire courant contenant le tracé demandé:

gnuplot> !ls -l *.svg 
-rw-r--r-- 1 sylvain sylvain 7328 Feb 20 00:08 my-file.svg
!
gnuplot> !file my*.svg
my-file.svg: SVG Scalable Vector Graphics image
!

!

Le point d'exclamation (!) permet d’exécuter une commande dans un shell sans quitter gnuplot.

Il existe également une commande system qui remplit le même but, mais qui a pour avantage de pouvoir être utilisée dans un script:

gnuplot> system('ls *.svg')
my-file.svg

Utilisations pratique

Si l'utilisation de base de gnuplot peut être rapidement comprise, c'est une autre affaire que de pouvoir réaliser un graphique exactement comme on le souhaite. Nous allons donc maintenant voir comment adapter ces graphiques à quelques besoins du monde réel … juste après avoir fait un petit détour pour explorer les capacités de calcul de gnuplot.

Calculer et afficher

gnuplot est avant tout un outil pour produire des graphiques. Mais c'est aussi une calculatrice. Ainsi, la fonction print permet d'afficher sur la console le résultat d'un calcul:

gnuplot> print 2*3
6

Arrondir à l'entier, ou pas

Si je parle de print, ce n'est pas parce que c'est la fonction la plus complexe à comprendre, mais parce qu'elle me permet de mettre en évidence un des pièges de gnuplot:

gnuplot> print 3/2
1

Quand une expression ne comporte que des entier, gnuplot fait les calculs en arithmétique entière. Avec tous les arrondis que cela implique. Si j'avais voulu un résultat à virgule, il fallait que je force en virgule flottante au moins une des deux valeurs:

gnuplot> print 3./2
1.5

ou

gnuplot> print 3/2.
1.5

Faire de la trigonométrie

Par défaut, gnuplot mesure les angles en radians:

gnuplot> print sin(90)
0.893996663600558
gnuplot> print sin(pi/2)
1.0

Vous pouvez si vous le souhaitez utiliser des mesures d'angle en degrés à la place grâce à la commande set angles degrees:

gnuplot> set angles degrees
gnuplot> print sin(90)
1.0
gnuplot> print sin(pi/2)
0.0274121335920443

Vous pouvez revenir à des mesures en radians à l'aide de set angles radians:

gnuplot> set angles radians
gnuplot> print sin(90)
0.893996663600558
gnuplot> print sin(pi/2)
1.0

Définir des fonctions et constantes

Jusqu'à présent, j'ai plutôt utilisé des expressions simples pour mes tracés ou mes calculs. Mais dans la réalité, c'est rarement le cas. Plutôt que devoir recopier à plusieurs reprises des expressions complexes dans un script, il est possible de définir des constantes et des fonctions personnalisées. Celles-ci peuvent ensuite être utilisées pour construire des expressions encore plus complexes, pour tracer (plot) ou calculer (print):

gnuplot> U=5 # volts
gnuplot> P(r)=U**2/r # watts
gnuplot> print P(100)
0

Hein? Normalement, cet exemple devrait calculer la puissance convertie en chaleur par effet Joule dans une résistance selon sa valeur. Notez l'utilisation de l'opérateur double-étoile (**) pour puissance. Mais là, le résultat est zéro?!?

Si vous avez suivi mon explication un peu plus haut, vous comprendrez que c'est parce que je n'ai mis que des constantes entières dans mon expression. Donc gnuplot calcule en arithmétique entière! Sauf cas particulier, c'est une bonne habitude de systématiquement rajouter un point décimal à vos constantes pour éviter de tomber dans ce piège:

gnuplot> U=5. # volts
gnuplot> P(r)=U**2./r # watts
gnuplot> print P(100)
0.25

Exécuter un script

Plutôt que de taper les commandes une à une à l'invite de l'interpréteur, il est possible de les regrouper dans un fichier texte pour en faire un script exécutable par gnuplot:

# Mon script:
sh$ cat script.gnu
set terminal pngcairo
plot sin(x)
# Exécution du script par gnuplot
sh$ gnuplot script.gnu
<89>PNG
^Z
^@^@^@^MIHDR^@^@^B<80>^@^@^A<E0>^H^F^@^@^@5<D1><DC><E4>^@^@^@^FbKGD^@<FF>^@<FF>
^@<FF><A0><BD><A7><93>^@^@ ^@IDATx<9C><EC>
{t<94>չ?<F0><EF>^@ !!<83><93>^Hr^K $<E1><92>@<90>^@!<9E><B6>^<C0>V<B4><94>SV~<95>r<DA><C6>u*<B4><C7>Kն<BF>uj<8D>
<B6>]<ED>^O<A4>u<B5><B6><B5><F6><B4><C6>sZ#j<AD><9E>"b<F5>^\[PQ^P<E5><9A>h ^Dr'ܓ
...

Si vous tapez le script et l'exécutez comme indiqué juste au dessus, vous devriez voir apparaitre une série de caractères bizarres sur votre écran. J'en parle ici, car c'est une erreur fréquente, mais facile à corriger, et qu'il faut y penser avant d'imaginer les pires horreurs.

En effet, ici, je demande à gnuplot de produire un fichier PNG. C'est ce qu'il fait – en envoyant le contenu binaire de ce fichier sur la console à partir de laquelle je l'ai invoqué. Cela se confirme si vous observez les tous premiers octet envoyés. En effet, vous pouvez y voir le début de la signature typique d'un fichier PNG: <89>PNG.

Ici, j'ai deux solutions pour résoudre le problème – ou plus exactement pour obtenir ce que je veux:

# Mon script:
sh$ cat script.gnu
set terminal pngcairo
set output 'mon-fichier.png'
plot sin(x)
# Exécution du script par gnuplot
sh$ gnuplot script.gnu
# Mon script:
sh$ cat script.gnu
set terminal pngcairo
plot sin(x)
# Exécution du script par gnuplot
sh$ gnuplot script.gnu > mon-fichier.png

Fonctionnellement, les deux options sont identiques. Le choix de l'une ou l'autre dépendra (un peu) des circonstances et (surtout) de vos goûts personnels.

Définir les dimension du graphiques

gnuplot-sin-x-x-10samples.png
La fonction sin(x*x) tracée dans gnuplot avec 10 échantillons.


gnuplot-sin-x-x-100samples.png
La fonction sin(x*x) tracée dans gnuplot avec 100 échantillons.


gnuplot-sin-x-x-1000samples.png
La fonction sin(x*x) tracée dans gnuplot avec 1000 échantillons.


Chaque terminal (driver) supporté par gnuplot est susceptible d'accepter des options lorsque vous le sélectionnez. La plupart des options sont spécifiques à un type de terminal. Mais il y en a une que l'on retrouve presque pour tous et avec la même syntaxe: l'option size qui permet de choisir les dimensions du graphique à produire:

# Produire des PNG de 800x600 pixels
set terminal pngcairo size 800,600
# Produire des PNG de 100x150 pixels
set terminal pngcairo size 100,150

Remarque:

Les valeurs par défaut et les dimensions maximales acceptables sont variables d'un driver à l'autre.

Changer la résolution du tracé

Tout d'abord, un point important à comprendre: les courbes tracées par gnuplot le sont à l'aide de segments de droites. Par défaut, gnuplot utilise 100 échantillons sur la courbe et les relie par des segments de droite pour former le tracé. Il peut être souhaitable d'augmenter le nombre d’échantillons pour permettre un tracé plus fin, pour tracer des courbes sur une image bitmap en plus haute résolution, ou encore pour permettre de zoomer lors de l'exploitation des images fournies dans un format de fichier vectoriel.

A titre de comparaison, les 3 images ci-contre représentent la même fonction, avec un nombre d'échantillons différent. Ces image ont été produites à l'aide du script suivant:

set terminal pngcairo size 350,200 font 'Sans,8'
 
# Définition d'une fonction personnalisée
f(x)=sin(x*x)
 
set samples 10
set output '10samples.png'
plot f(x)
 
set samples 100
set output '100samples.png'
replot
 
set samples 1000
set output '1000samples.png'
replot

Comme vous le voyez, c'est la commande set sample qui permet de définir le nombre d'échantillons. Plus ce nombre est important, plus le graphique est fin.

Remarque:

Il est tout à fait possible de tracer plusieurs courbes à partir d'un même script. Comme sont nom l'indique, la commande replot permet de refaire le même tracé.

Définir les limites du graphique

Il existe dans gnuplot diverses manières de définir les limites du graphique. La plus simple est d'utiliser les commandes set xrange et set yrange.

Si je veux restreindre le graphique à l'intervalle [-pi:pi] sur l'axe des abscisses et à l'intervalle [-2:2] sur l'espace des ordonnées, j’écrirai:

set xrange [-pi:pi]
set yrange [-2:2]
gnuplot-sin-x-x-range.png
set terminal pngcairo size 350,200 font "DejaVu Sans,8"
 
# Définition d'une fonction personnalisée
f(x)=sin(x*x)
 
set xrange [-pi:pi]
set yrange [-2:2]
 
set samples 1000
set output '1000samples.png'
plot f(x)



Tracer plusieurs courbes

Pour tracer plusieurs courbes, il faut les indiquer toutes à la même commande plot. Les différents tracés étant séparés dans le code source par une virgule:

plot f(x), \
    (x+1)/5

backslash

Remarquez le backslash à la fin de la première ligne de la commande plot. Celui-ci n'a rien à voir avec le fait que je trace deux courbes! Son rôle est simplement d'informer gnuplot que la commande n'est pas terminée et qu'elle se continue à la ligne suivante.

gnuplot-sin-x-2-courbes.png
set terminal pngcairo size 350,200 font "DejaVu Sans,8"
 
# Définition d'une fonction personnalisée
f(x)=sin(x*x)
 
set xrange [-pi:pi]
set yrange [-2:2]
 
set samples 1000
set output '1000samples.png'
 
# Tracé de 2 courbes
# Notez la 'virgule' pour séparer les
# deux fonctions et la 'backslash' pour
# indiquer que la commande se continue
# sur la ligne suivante
plot f(x), \
    (x+1)/5



Modifier le style de ligne

gnuplot propose de nombreuses options pour affiner les graphiques afin de les rendre les plus parlants et les plus attrayants possible. Ces options sont trop nombreuses pour être détaillées dans cet article d'introduction. Je vais donc me contenter ici du minimum, à savoir pouvoir changer le style de ligne (couleur, épaisseur) utilisé pour tracer les courbes.

La méthode la plus propre de procéder consiste à (re)définir un style de ligne, puis, lors du tracé, à demander à gnuplot d'utiliser le style que vous avez défini. Pour (re)définir un style, vous utiliserez le commande set style line:

set style line 10 linetype 1 \
                  linecolor rgb "#5080cb" \
                  linewidth 1
set style line 11 linetype 1 \
                  linecolor rgb "#10bb70" \
                  linewidth 3

Ici, je redéfinis les styles de ligne n°10 et n°11. Pour chacun je donne son type (1 – par défaut, une ligne continue), sa couleur RGB, et son épaisseur (1 pixel).

Pour tracer une courbe avec un de ces styles, il suffit de l'indiquer explicitement:

plot f(x) linestyle 10, \
    (x+1)/5 ls 11

Remarque:

linestylels
linewidthlw
linecolorlc
linetypelt

gnuplot utilise de nombreux mots-clés. La plupart du temps ceux-ci peuvent être abrégés, ce qui rend les scripts parfois assez illisibles pour le néophyte. Ainsi, dans l'exemple de code ci-dessus, j'ai employé l'abréviation ls au lieu d'écrire linestyle pour le second tracé. Je mélange ici les deux notations pour illustrer cette possibilité, mais, dans la pratique, c'est un meilleur style que d'utiliser soit systématiquement les abréviations, soit systématiquement les noms complets.

gnuplot-sin-x-style.png
set terminal pngcairo size 350,200 font "DejaVu Sans,8"
 
f(x)=sin(x*x)
 
# Style de ligne personnalisés
# (le second style utilise des 'abréviations'
# pour les mots-clés)
set style line 10 linetype 1 linecolor rgb "#5080cb" lw 1
set style line 11 lt 1 lc rgb "#10bb70" lw 3
 
set xrange [-pi:pi]
set yrange [-2:2]
 
set samples 1000
set output '1000samples.png'
 
plot f(x) linestyle 10, \
    (x+1)/5 linestyle 11



Tracer des segments de courbe

Il reste une dernière technique que je veux vous montrer avant de terminer. Celle-ci permet de tracer des segments de courbes sur l'intervalle du graphique. Ce peut être utile pour mettre en évidence certaines portions du tracé, par exemple.

Si je veux vous montrer cette possibilité, c'est parce qu'elle utilise deux techniques fréquentes dans les script gnuplot. La première est l'emploi de l'opérateur ternaire ? :. C'est le même opérateur que celui qu'on trouve en C et dans les langages dérivés. Cet opérateur commence par un test. Si celui-ci est vrai, le résultat de l'opération est la valeur qui précède le « deux-points ». Sinon, le résultat est la valeur qui suit le « deux-points ».

La seconde technique est plus un truc: en effet lors d'un tracé, gnuplot ignore silencieusement les valeurs qui ne sont pas des nombres. Pour empêcher le tracé d'un point, le truc consiste donc à lui donner une valeur non-numérique comme l'infini, qui s'écrit en gnuplot 1/0. Quand on utilise ces deux techniques, on peut écrire une fonction qui n'est définie que pour certains points. Ainsi, la fonction ci-dessous vaut f(x) quand f(x)>(x+1)/5 et est in(dé)finie autrement:

g(x)=( f(x)>(x+1)/5 ? f(x) : 1/0 )

Ensuite, en jouant sur les style, on peut par exemple obtenir un graphique comme illustré ci-dessous qui met en évidence les points où f(x)>(x+1)/5.

gnuplot-sin-x-infinity.png
set terminal pngcairo size 351,200 font "DejaVu Sans,8"
 
f(x)=sin(x*x)
 
# La fonction g n'est définie que 
# quand f(x)>(x+1)/5
g(x)=( f(x)>(x+1)/5 ? f(x) : 1/0 )
 
set style line 10 linetype 1 linecolor rgb "#5080cb" lw 1
set style line 11 lt 1 lc rgb "#10bb70" lw 3
 
set xrange [-pi:pi]
set yrange [-2:2]
 
set samples 1000
set output '1000samples.png'
 
plot f(x) linestyle 10, \
    g(x) linestyle 11 title 'f(x)>(x+1)/5'



Conclusion

Voilà, ce tour d'horizon express de gnuplot est terminé. En fait, je n'ai fait qu'en égratigner la surface: gnuplot est un logiciel sophistiqué et complexe. Il est certain que s'en servir pour générer des graphiques requiert plus d'efforts que simplement cliquer à droite à gauche dans une application graphique. Mais l'inverstissement en vaut la chandelle. Pour vous en convaincre, je vous conseille de parcourrir le site http://www.gnuplotting.orgHagen Wierstorf nous explique comment il utilise gnuplot pour produire des graphiques scientifiques de toute beauté. Son exemple devrait être une réelle source d'inspiration et de motivation!

Ressources