Mémo GNUPLOT pour c#

Michel Llibre - Mai 2024

Il faut d'abord installer GNUPlot sur le PC.

GNUPlot permet de faire des tracés en écrivant des commandes dans une fenêtre de script.

L'intégration à C#, se fait en ajoutant au projet C# le fichier GnuPlot.cs que l'on télécharge ici https://github.com/AwokeKnowing/GnuplotCSharp, ou par le biais de Visual Studio avec le git ou NuGet. Ce fichier est inclus dans le projet GnuplotCharp qui est un exemple qui trace les courbes décrites ci-après.

Le fichier GnuPlot.cs comporte en dur en ligne 12 l'emplacement du répertoire Gnuplot sur notre PC. Généralement ce n'est pas correcte et il faut modifier cette ligne :

        public static string PathToGnuplot = @"C:\gnuplot\bin";

Quand c'est bon, on ajoute ce fichier aux fichiers du projet, et dans les fichiers c# où on veu appeler les functions de Gnuplot on ajoute :

using AwokeKnowing.GnuplotCSharp;

 

Remarque : ce nom AwokeKnowing.GnuplotCSharp peut être modifié, mais il faut modifier en conséquence la ligne :

namespace AwokeKnowing.GnuplotCSharp

dans GnuPlot.cs. On peut même ne pas mettre de namespace et pas de using, les fonctions sont trouvées sans problème.

 

Les tableaux de coordonnées passées à GnuPlot ne sont pas recopiés. Tant que le tracé est affiché, les coordonnées ne doivent pas être modifiées !

 

Le programme de demo :

GnuPlot.Plot("sin(x) + 2");

On précise la couleur et le line_width

GnuPlot.Plot("sin(x) + 2", "lc rgb 'magenta' lw 5");

lc pour préciser line-color

lw pour préciser line-width

 

Tracé liste de valeurs (en fonction de 0 à n-1)

double[] Y = new double[] { -4, 6.5, -2, 3, -8, -5, 11, 4, -5, 10 };

GnuPlot.Plot(Y); //Sans rien préciser on a des points

Avec des lignes à la place des points : "with lines" ou "w l"

double[] X = new double[] { -10, -8.5, -2, 1, 6, 9, 10, 14, 15, 19 };

double[] Y = new double[] { -4, 6.5, -2, 3, -8, -5, 11, 4, -5, 10 };

GnuPlot.Unset("key"); // Supprime l'indication "-"

GnuPlot.Plot(X, Y, "with lines");

Utilisation de Hold On :

Le hold on doit précéder le premier tracé, sinon il n'apparait pas.

GnuPlot.HoldOn();

GnuPlot.Plot("cos(x) + x");

GnuPlot.Plot("cos(2*x)", "with points pt 3"); // ou "w p pt 3"

Tracé d'une fonction z = f(x,y) en 3D

GnuPlot.SPlot("1 / (.05*x*x + .05*y*y + 1)");

Préciser le nombre de lignes iso X-Y (10 par défaut)

GnuPlot.Set("isosamples 30");

GnuPlot.SPlot("1 / (.05*x*x + .05*y*y + 1)");

Cacher les lignes arrières "hidden3d

GnuPlot.Set("isosamples 30", "hidden3d");

GnuPlot.SPlot("1 / (.05*x*x + .05*y*y + 1)");

Tracer les données d'un fichier (tous les formats gnuplot)

splot ("data.txt");

Tracé d'une liste d'altitudes en z-couleur (pm3d)

double[] Z = new double[] { -4, -2.5, 1, 3,    -3, -2, 3, 4,    -1, 2, 6, 8 };

GnuPlot.Set("pm3d"); //couleurs des plans en fonction de z

GnuPlot.SPlot(4, Z); //Liste partagée en groupes de 4 points

Idem en niveau de gris, avec les points marqués par symboles n°6 (rond)

Le tableau Z est pré-partagé en groupes de 4 :

double[,] Z = new double[,] { {-4,-2.5,1,3},  {-3,-2,3,4},   {-1,2,6,8 } };

GnuPlot.Set("pm3d","palette gray"); //gris en fonction du z

GnuPlot.SPlot(Z,"with points pointtype 6"); //sommets marqués par un rond (type 6)

Nuage de point 3D

//Coordonnées aléatoires

        double[] X = new double[100];

        double[] Y = new double[100];

        double[] Z = new double[100];

        Random r=new Random();

        for (int i = 0; i < 100; i++) {

            X[i] = r.Next(30) - 15;

            Y[i] = r.Next(50) - 25;

            Z[i] = r.Next(20) - 10; }

//Domaine des x, y et z

        GnuPlot.Set("xrange[-30:30]", "yrange[-30:30]", "zrange[-30:30]");

//pointtype 8 (triangle) et couleur bleu

        GnuPlot.SPlot(X, Y, Z, "with points pointtype 8 lc rgb 'blue'");

 

Idem, mais définit une surface en z-couleur (pm3d),  avec tracé des  iso X-Y

GnuPlot.Set("dgrid3d 31,21"); // 31 lignes X et 31 lignes Y => 30 x 20 rectangles

GnuPlot.Set("xrange[-30:30]", "yrange[-30:30]", "zrange[-30:30]");

GnuPlot.SPlot(X, Y, Z,"with pm3d");

GnuPlot.HoldOn();

GnuPlot.Set("title 'Phase-Locked Signals'");

GnuPlot.Set("samples 2000");

GnuPlot.Unset("key"); // Supprime indications sin(x)- et cox(x)-

GnuPlot.Plot("sin(x)");

GnuPlot.Plot("cos(x)");

Mes essais

Tracé dans une fenêtre de type "windows"

            GnuPlot.Set("terminal windows");

            GnuPlot.Plot(l_eDec.ToArray(), "with lines lc rgb 'blue'");

Remarquer la différence au niveau des boutons : Il n'y a plus les loupes, la grille, etc..

Liste des terminaux :

gnuplot> set terminal
Available terminal types:
cairolatex  LaTeX picture environment using graphicx package and Cairo backend
    canvas  HTML Canvas object
       cgm  Computer Graphics Metafile
   context  ConTeXt with MetaFun (for PDF documents)
   domterm  DomTerm terminal emulator with embedded SVG
      dumb  ascii art for anything that prints text
       dxf  dxf-file for AutoCad (default size 120x80)
       emf  Enhanced Metafile format
  epscairo  eps terminal based on cairo
  epslatex  LaTeX picture environment using graphicx package
       fig  FIG graphics language V3.2 for XFIG graphics editor
       gif  GIF images using libgd and TrueType fonts
      hpgl  HP7475 and relatives [number of pens] [eject]
      jpeg  JPEG images using libgd and TrueType fonts
kittycairo  kitty in-terminal graphics using cairo
   kittygd  kitty in-terminal graphics using libgd
       lua  Lua generic terminal driver
      pcl5  PCL5e/PCL5c printers using HP-GL/2
  pdfcairo  pdf terminal based on cairo
    pict2e  LaTeX2e picture environment
       png  PNG images using libgd and TrueType fonts
  pngcairo  png terminal based on cairo
postscript  PostScript graphics, including EPSF embedded files (*.eps)
   pslatex  LaTeX picture environment with PostScript \specials
     pstex  plain TeX with PostScript \specials
  pstricks  LaTeX picture environment with PSTricks macros
        qt  Qt cross-platform interactive terminal
   sixelgd  sixel using libgd and TrueType fonts
       svg  W3C Scalable Vector Graphics
   texdraw  LaTeX texdraw environment
      tikz  TeX TikZ graphics macros via the lua script driver
  tkcanvas  Tk canvas widget
   unknown  Unknown terminal type - not a plotting device
      webp  single frame or animation using cairo, pango, and libwebp
   windows  Microsoft Windows
       wxt  wxWidgets cross-platform interactive terminal
gnuplot>

 

Le terminal par défaut semble être le qt : Exemple :

            GnuPlot.Set("terminal qt 1");

            GnuPlot.Plot(l_eAD.ToArray(), "with lines lc rgb 'red'");

            GnuPlot.Set("terminal qt 2");

            GnuPlot.Plot(l_eDec.ToArray(), "with lines lc rgb 'blue'");

 

 

 Et voici avec wxt :

            GnuPlot.Plot(l_eAD.ToArray(), "with lines lc rgb 'red'");

            GnuPlot.Set("terminal wxt 2");

            GnuPlot.Plot(l_eDec.ToArray(), "with lines lc rgb 'blue'");

Essais de Multiplots

        double[] X = new double[] { -10, -8.5, -2, 1, 6, 9, 10, 14, 15, 19 };

        double[] Y = new double[] { -4, 6.5, -2, 3, -8, -5, 11, 4, -5, 10 };

        GnuPlot.Set("multiplot layout 2,2");

        GnuPlot.Plot(X, "w l t 'X'") ;

        GnuPlot.Plot(Y, "w l t 'Y'");

        GnuPlot.Plot(X, Y, "w l t 'Y=f(X)'");

        GnuPlot.Plot(Y, X, "w l t 'X = F(Y)'");

        GnuPlot.Unset("multiplot");

Par défaut , le remplissage des cases se fait ligne par ligne, de gauche à droite, mais on peut préciser différemment avec les options : {rowsfirst|columnsfirst} et/ou {downwards|upwards}

set multiplot
{
layout <rows>,<cols>

{downwards|upwards}
{title <page title>}
{scale <xscale>{,<yscale>}}
{offset <xoff>{,<yoff>}}
}    
unset multiplot

Le Set de paramétrage (titre, etc...) de chaque plot doit précéder le Plot.