Forum: PC-Programmierung Gnuplot; Plot aus Array erstellen


von Ludwig P. (lprade)


Lesenswert?

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

von Klaus W. (mfgkw)


Lesenswert?

Es sollte auch gehen, gnuplot aus einer pipe zu füttern.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Klaus Wachtler schrieb:
> Es sollte auch gehen, gnuplot aus einer pipe zu füttern.

Wird im Artikel unter den Kommentaren sogar mit Beispiel genannt...

von Ludwig P. (lprade)


Lesenswert?

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

von Klaus W. (mfgkw)


Lesenswert?

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.

von Yalu X. (yalu) (Moderator)


Lesenswert?

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
}

von Ludwig P. (lprade)


Lesenswert?

Hi,
viele Dank, dass sieht ja recht gut aus. Werds morgen mal ausprobieren.
Viele Grüße,
Ludwig

von Ludwig P. (lprade)


Lesenswert?

Hi,
funktioniert genau wie ich wollte, vielen Dank!

von moe60 (Gast)


Lesenswert?

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

von Klaus W. (mfgkw)


Lesenswert?

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
Noch kein Account? Hier anmelden.