Hallo, ich habe unter http://linuxgazette.net/168/misc/lg/2_cent_tip__piping_to_gnu_plot_from_c.html raus gekriegt, wie ich aus C Gnuplot ansprechen kann. Jezt möchte ich Daten plotten, die nicht in einer externen Datei so wie "data.dat" vorliegen, sondern in einen int Array gespeichert sind. Gibt es eine Möglichkeit, Gnuplot direkt das Array zum plotten zu übergeben, oder muss ich die Daten erst in einer Datei abspeichern, und diese dann übergeben? Der Hintergrund ist, dass ich Messdaten, die mit eine Rate von circa 10 Hertz kommen in Echtzeit graphisch darstellen möchte. Dazu möchte ich nicht jedes Mal eine neue Datei erstellen. Vielen Dank, Ludwig
Klaus Wachtler schrieb: > Es sollte auch gehen, gnuplot aus einer pipe zu füttern. Wird im Artikel unter den Kommentaren sogar mit Beispiel genannt...
Eine Pipe benutzt das erste Beispiel doch auch schon. Falls ihr den 2. Post auf der Website meint ist da ja von einer "named FIFO" die Rede. Da verstehe ich nicht, was gemeint ist. Bin grad mal am nachlesen, was es mit "named FIFO" auf sich hat
Die named pipe (FIFO) gibt es m.W. nur unter Unix etc.; nicht unter Windows. Was ich meinte ist gnuplot mit der Standardeingabe zu füttern, das geht auch unter Windows - falls du Windows hast. Unter Unix/Linux sowieso.
Klaus Wachtler schrieb: > Die named pipe (FIFO) gibt es m.W. nur unter Unix etc.; nicht unter > Windows. Die gibt es auch in Windows, wird allerdings etwas anders verwendet: http://msdn.microsoft.com/en-us/library/windows/desktop/aa365590%28v=vs.85%29.aspx In Ludwigs Fall sind aber unbenannte Pipes völlig ausreichend bzw. sogar besser geeignet, da die Anwendung den Gnuplot-Prozess selber startet und somit bereits eine geeignete Referenz besitzt, wo sie den Datenstrom hinsenden kann. Genau das wird im ersten Beispiel im Linux-Gazette- Artikel gemacht. Wenn man beim plot-Befehl als Dateinamen '-' angibt, liest Gnuplot die Plotdaten aus dem gleichen Datenstrom wie die Befehle, so dass man keine temporäre Datei für die Daten anlegen muss. Das sieht dann etwa so aus (animierte gedämpfte Sinusschwingung):
1 | #include <stdio.h> |
2 | #include <stdlib.h> |
3 | #include <math.h> |
4 | |
5 | #define GNUPLOT "gnuplot -persist"
|
6 | |
7 | int main(int argc, char **argv) { |
8 | FILE *gp; |
9 | double x, y, dx; |
10 | int i, j; |
11 | |
12 | gp = popen(GNUPLOT,"w"); /* 'gp' is the pipe descriptor */ |
13 | if (gp==NULL) |
14 | {
|
15 | printf("Error opening pipe to GNU plot. Check if you have it! \n"); |
16 | exit(0); |
17 | }
|
18 | |
19 | fprintf(gp, "set style data lines\n"); |
20 | fprintf(gp, "set yrange [-1:1]\n"); |
21 | fprintf(gp, "set ytics 0.5\n"); |
22 | fprintf(gp, "set grid\n"); |
23 | fprintf(gp, "set key off\n"); |
24 | |
25 | for (j=0; j<1000; j++) { |
26 | fprintf(gp, "plot '-'\n"); // Plotten von Daten im Eingabestrom |
27 | dx = 0.3 * j; |
28 | for (i=0; i<=1000; i++) { |
29 | x = 0.01 * i; // Hier könnten auch Array- |
30 | y = sin(5*x-dx) * exp(-0.5*x); // zugriffe stehen |
31 | fprintf(gp, "%f %f\n", x, y); // Koordinatenpaar an Gnuplot senden |
32 | }
|
33 | fprintf(gp, "e\n"); // Ende des Datensatzes |
34 | }
|
35 | fclose(gp); |
36 | |
37 | return 0; |
38 | }
|
Hi, viele Dank, dass sieht ja recht gut aus. Werds morgen mal ausprobieren. Viele Grüße, Ludwig
Hallo, ich bin totaler C Anfänger und möchte auch gerne ein Array aus C (Code::Blocks) mit GNUPLOT plotten. (2D Array--- einfacher XY Plot) Hierzu würde ich gerne den oben aufgeführten Code erst einmal als Ausgang zum Verständnis verwenden. Ich benutze CodeBLocks mit dem GCC Compiler auf Win7/64bit. Gnuplot 4.6 ist installiert. Wenn ich den oberen Code ausführe bekomme ich folgende Fehlermeldung im Terminal: "Der Befehl GNUPLOT ist entweder falsch geschrieben oder konnte nicht ausgeführt werden" Muss ich die GNUPLOT Installation in CodeBlocks noch irgendwo angeben, verlinken, etc? Ich habe leider keine Ahnung davon, wie ich CodeBLocks und GNUPLOT verknüpfen kann. Falls ihr noch weitere Informationen benötigt, um mir Tips geben zu können, schreibt mir einfach zurück. Vielen Dank. moe60
Kannst du gnuplot aus der Kommandozeile aufrufen? Wenn nicht: entweder mit vollem Pfad aufrufen, oder den Pfad in der PATH-Variablen hinterlegen
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.