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!
Evtl so wie auf http://stackoverflow.com/questions/20981589/use-text-column-from-data-file-as-points-label-in-gnuplot beschrieben?
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!
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
Herzlichen Dank! Funktioniert wunderbar! Wenn nur alle hier so hilfreiche Antworten geben würden! Gruß
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!
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.