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)");
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.