Forum: PC-Programmierung Punkte in GNUplot nummerieren


von Progger (Gast)


Lesenswert?

Hallo!

Ich muss Messpunkte mit GNUplot darstellen.

Dabei verwende ich den Befehl:

plot '-' with lines
x y
x y
x y
...
x y
e

Soweit passt es auch.

Aber: wie könnte man noch machen, dass Nummern bei den Punkten im 
Graphen angeschrieben stehen könnten?

Also z.B. hat der erste Punkt die Nummer 229 und der zweite die Nummer 
212 (unabhängig von der Plot-Reihenfolge).

Danke im Voraus!

von Rolf M. (rmagnus)


Lesenswert?


von Progger (Gast)


Lesenswert?

Hallo!

Danke für die Antwort, sie hat mich um einiges weitergebracht.

Eines ist mir jedoch noch unklar:

Also ich rufe das ganze aus einem C-Programm aus auf.

Wenn ich mit:

fprintf(gpl, "plot '-' using 1:2:3 w labels\n");

das Plotten beginne und mit:

fprintf(gpl, "%.1f %.1f (%ld)\n", p->x, p->y, p->n); //x-Wert, Y-Wert, 
Nummer

die Punkte in einer Schleife nacheinander übergebe und mit

fprintf(gpl, "e\n");

abschließe, werden nur die Labels geplottet.

Ich möchte aber, dass die Punkte auch verbunden werden.

Ein "with lines" lässt sich nicht hinzufügen. Ich finde auch sonst keine 
Möglichkeit, den Befehl anzufügen.

Habe schon mehrfach gegoogelt mit verschiedenen Suchbegriffen, aber 
nichts konnte mir den richtigen Denkanstoß geben.

Danke für alle Hinweise im Voraus!

von Yalu X. (yalu) (Moderator)


Angehängte Dateien:

Lesenswert?

Um Linien und Labels zu plotten, bedarf es zweier Plots in der Form

1
plot <erster Plot> with lines , <zweiter Plot> with labels

Kommen die Daten aus einer Datei, ist das kein Problem, dann wird die
Datei einfach zweimal gelesen. Inline-Daten mit '-' als Pseudodateinamen
können aber nur einmal gelesen werden, der zweite Plot erwartet einen
neuen Inline-Datensatz. Um zweimal denselben Datensatz zu plotten,
müsste dieser also doppelt angegeben werden.

Es gibt aber noch eine weitere Möglichkeit, Inline-Daten anzugeben, so
dass sie auch mehrfach genutzt werden können, nämlich als Here-Document
(wie in der Shell).

Hier ist ein kleines Beispiel:

1
$mydata << EOD
2
# x  y label
3
  0  0  229
4
  1  1  212
5
  2  4  314
6
  3  9  272
7
  4 16  333
8
  5 25  999
9
EOD
10
set xrange [-1:6]
11
set yrange [-5:30]
12
set grid
13
plot $mydata with linespoints pt 7, $mydata with labels left offset 0.5,-0.5 notitle

Edit:

Das Feature nennt sich "named data block" und ist seit Version 5
verfügbar, also noch ziemlich frisch.

: Bearbeitet durch Moderator
von Progger (Gast)


Lesenswert?

Herzlichen Dank!
Funktioniert wunderbar!

Wenn nur alle hier so hilfreiche Antworten geben würden!

Gruß

von Progger (Gast)


Lesenswert?

Vielleicht noch eine kurze Frage:

Wie schließe ich aus dem C-Programm heraus das GNUplot-Fenster?

fprintf(gpl, "exit\n");
fflush(gpl);

funktioniert leider nicht. Man muss das Fenster immer manuell schließen.

(Aufgerufen wird das ganze mit -persist)

Danke im Voraus!

von Yalu X. (yalu) (Moderator)


Lesenswert?

Progger schrieb:
> Wie schließe ich aus dem C-Programm heraus das GNUplot-Fenster?
>
> ...
>
> (Aufgerufen wird das ganze mit -persist)

Die Option -persist dient ja gerade dazu, das Schließen des Fensters dem
Benutzer zu überlassen.

Aber auch ohne -persist kann ich nicht auf Anhieb sagen, wie das geht,
zumal es hier evtl. OS-spezifische Unterschiede gibt und ich mit Gnuplot
unter Windows keine Erfahrung habe.

Edit:

Folgendes Progrämmchen funktioniert unter Linux perfekt:

1
#include <stdio.h>
2
#include <unistd.h>
3
4
int main(void) {
5
  FILE *gpl = popen("gnuplot", "w");
6
7
  fprintf(gpl, "set samples 1000\n");
8
  for(int i=0; i<1000; i++) {
9
    fprintf(gpl, "plot sin(x+%f)\n", 0.05*i);
10
    fflush(gpl);
11
    usleep(10000);
12
  }
13
  pclose(gpl);
14
}

Es zeigt eine animierte Sinuskurve an, und nach 10 Sekunden wird mit
pclose() sowohl die Pipe-Verbindung als auch das Fenster geschlossen.

: Bearbeitet durch Moderator
von TO (Gast)


Lesenswert?

Hallo!

Danke für die Antwort!

Dass es unter Linux besser läuft, dachte ich mir, ich arbeite auch viel 
viel lieber damit.

Leider muss dieses Programm unter Win laufen...

Gruß

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.