Tracé du relief avec Gnuplot

Gnuplot

ENTRAVAUX

Relief d'après une grille de hauteurs au format texte

    $ cat grid.dat
    5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
    5 5 5 5 5 4 5 5 5 5 5 5 5 5 5 5
    5 5 5 5 4 3 4 5 5 5 5 5 5 5 5 5
    5 5 5 4 3 2 3 4 5 5 5 5 5 5 5 5
    5 5 4 3 2 1 2 3 4 5 5 5 5 5 5 5
    5 4 3 2 1 0 1 2 3 4 5 5 5 5 5 5
    5 5 4 3 2 1 2 3 4 5 5 5 5 5 5 5
    5 5 5 4 3 2 3 4 5 6 5 5 5 5 5 5
    5 5 5 5 4 3 4 5 6 7 6 5 5 5 5 5
    5 5 5 5 5 4 5 6 7 8 7 6 5 5 5 5
    5 5 5 5 5 5 6 7 8 9 8 7 6 5 5 5
    5 5 5 5 5 6 7 8 9 10 9 8 7 6 5 5
    5 5 5 5 5 5 6 7 8 9 8 7 6 5 5 5
    5 5 5 5 5 5 5 6 7 8 7 6 5 5 5 5
    5 5 5 5 5 5 5 5 6 7 6 5 5 5 5 5
    5 5 5 5 5 5 5 5 5 6 5 5 5 5 5 5
    gnuplot> splot "grid.dat" matrix with lines

http://www.k1ka.be/pics/gnuplot/3d01.png

    gnuplot> set view map
    gnuplot> splot "grid.dat" matrix with pm3d

http://www.k1ka.be/pics/gnuplot/3d02.png

Noter que le fichier de données comprend des rangs de 16 valeurs, mais que la «carte» obtenue ne comprend que 15 cases en largeur. Chaque point est un coin d'une case. Comme ces quatre points ne figurent pas nécessairement dans un même plan, le polygone correspondant à la case peut être «gauche». Exemple d'un fichier contenant seulement 4 points:

    $ cat grid.dat
    1 0
    0 1
    
    gnuplot> splot 'grid.dat' matrix with pm3d

http://www.k1ka.be/pics/gnuplot/gauche01.png

    gnuplot> set view map
    gnuplot> splot 'grid.dat' matrix with pm3d

http://www.k1ka.be/pics/gnuplot/gauche02.png

La couleur correspond à la moyenne des 4 sommets du polygone. Par contre, si on trace les données en deux dimensions avec image, chaque case correspond à un point, autour duquel elle est centrée. Par conséquent, le graphe s'étend dans chaque dimension de min - 0.5 à max + 0.5:

  gnuplot> plot "grid.dat" matrix with image

http://www.k1ka.be/pics/gnuplot/gauche03.png

Les données vues plus haut donnent ceci:

http://www.k1ka.be/pics/gnuplot/3d03.png

Tracé à partir du fichier spécial "-"

Ce nom de fichier attend des données introduites ligne par ligne jusqu'à l'introduction d'un 'e' terminal. Avec splot, il faut le répéter (noter le prompt de gnuplot qui est modifié tant qu'on n'a pas introduit les 'e' finaux).

    gnuplot> splot "-" matrix with lines
    input data ('e' ends) > 1 2 3
    input data ('e' ends) > 0 1 2
    input data ('e' ends) > -1 0 1
    input data ('e' ends) > e
    input data ('e' ends) > e

Relief d'après une image

Pour connaître les formats supportés:

  gnuplot> show datafile binary filetypes
        This version of gnuplot understands the following binary file types:
          avs     bin     edf     ehf     gif     gpbin   jpeg    jpg
          png   raw      rgb     auto

Exemple d'une image créée avec ImageMagick

  $ convert  -size 100x100 gradient:  gradient.png
  gnuplot> set pm3d at s
  gnuplot> unset surface
  gnuplot> splot "gradient.png" binary filetype=png

On utilisera logiquement un fichier en nuances de gris. Si l'on utilise un fichier en couleurs, seul le canal rouge sera utilisé. On peut s'en apercevoir avec cette image sur la synthèse de couleur additive provenant de Wikimedia:

http://www.k1ka.be/pics/gnuplot/AdditiveColorMixing.png

  > set pm3d at bottom
  > splot 'AdditiveColorMixing.png' binary  filetype=png every 3:3 with lines  notitle

http://www.k1ka.be/pics/gnuplot/RedCanalPng.png

Seul le cercle correspondant au rouge a une valeur différente de 0, soit 255 puisque chaque canal du PNG est encodé sur un octet, et est représenté par la couleur jaune sur ce tracé. On pourrait obtenir la même représentation, mais en deux dimensions, avec

  > plot 'AdditiveColorMixing.png' binary  filetype=png  using 1 with image

http://www.k1ka.be/pics/gnuplot/RedCanalPng2d.png

D'après un fichier binaire

ImageMagick peut convertir ou créer des images dans un format brut, de suffixe .rgb, composé seulement de données binaires, sans précisions quant au nombre de rangs/colonnes:

  $ convert  -size 100x100 gradient: -depth 8 gradient.rgb

Pour lire un tel fichier, on utilisera:

  > splot 'gradient.rgb' binary array=(100,100)  format='%uint8%uint8%uint8' with pm3d 

Autres méthodes:

Le fichier est créé par ce programme Pascal:

    VAR
      i,n: INTEGER;
      F: FILE OF INTEGER;
    BEGIN
      ASSIGN(F,NomDeFichier);
      FileMode := 2;
      REWRITE(F);
      n := 0;
      FOR i:=0 TO 255 DO BEGIN
        WRITE(F,n);
        n := n+1
      END;
      CLOSE(F);
    END.

Il est tracé par

  splot 'binary.dat' binary array=16x16 format='%uint16' with pm3d at s

Avec les données ETOPO5

Voir Cartes en relief avec ETOPO5