So zeichnen Sie Daten in C
-
Verwenden Sie die Funktion
gnuplot
, um die Anzeige für das Dateiende im Dateistream zu überprüfen -
Verwenden Sie die Funktion
popen
, um Plotdaten an den Prozessgnuplot
zu streamen
In diesem Artikel werden verschiedene Methoden zum Plotten von Daten in C erläutert.
Verwenden Sie die Funktion gnuplot
, um die Anzeige für das Dateiende im Dateistream zu überprüfen
gnuplot
ist ein leistungsstarkes Plotprogramm, mit dem Plots angezeigt und als Dateien gespeichert werden können. Es wird im Allgemeinen bei Dateidatensätzen mit dem einfachen spaltenbasierten Format verwendet, bei dem jede Spalte durch ein einzelnes Leerzeichen begrenzt ist, wie unten gezeigt. In diesem Beispiel verwenden wir die Funktion popen
, um die Befehle an das Programm gnuplot
zu streamen und die in einer separaten Datei gespeicherten Daten zu zeichnen. Die gnuplot
-Dokumentation kann auf dieser Seite gelesen werden. In diesem Fall verwenden wir nur die einfachsten Befehle, um die Verwendung zu demonstrieren.
Der Befehl plot
ist der Kernteil, der verschiedene Argumente und Parameter verwendet, um den Plot zu verarbeiten und zu rendern. Wir liefern eine Datei mit 2 Spalten mit Zahlen, die als Liniendiagramm dargestellt werden müssen. Der Befehl hat das folgende Format plot 'input.txt' t 'Price' w lp
, das mit fprintf
erstellt und in den vom Aufruf popen
zurückgegebenen Dateistream-Zeiger geschrieben wird. Der Bezeichner t
im Befehl ist eine Abkürzung für title und das Schlüsselwort w
- with
, das den Stil des Diagramms angibt. In diesem Fall wird der Stil lp
(Linienpunkte) gewählt, um mehrere Preispunkte über einen bestimmten Zeitraum darzustellen. Beachten Sie, dass wir den Stream explizit fflush
, um sicherzustellen, dass die Daten an das Programm gnuplot
übermittelt werden, und das Programm schließlich mit der Funktion getchar
anhalten, um sicherzustellen, dass der Plot angezeigt wird, bis der Benutzer ihn schließt.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
const char *filename = "input.txt";
FILE *gnuplot = popen("gnuplot", "w");
if (!gnuplot) {
perror("popen");
exit(EXIT_FAILURE);
}
fprintf(gnuplot, "plot \"%s\" t 'Price' w lp\n", filename);
fflush(gnuplot);
fprintf(stdout, "Click Ctrl+d to quit...\n");
getchar();
pclose(gnuplot);
exit(EXIT_SUCCESS);
}
Eingabedateiformat:
2005 49
2006 52
...
2019 154
2020 127
2021 147
Verwenden Sie die Funktion popen
, um Plotdaten an den Prozess gnuplot
zu streamen
Alternativ können wir die zuvor gespeicherten Daten in einer separaten Datei direkt aus dem Programmspeicher streamen. Mit der Funktion popen
wird erneut eine Pipe-Kommunikation zum Programm gnuplot
geöffnet und anschließend die in Arrays gespeicherten Nummern mit spezieller Formatierung gesendet. In diesem Beispiel hat der Befehl das Format - plot '-' u 1:2 t 'Price' w lp
, gefolgt von den Datenelementen und endet schließlich mit dem Zeichen e
. Jede Ganzzahl sollte durch Leerzeichen getrennt und in einem ähnlichen Format wie die Eingabedatei des vorherigen Beispiels übergeben werden. Daher verwenden wir die Funktion fprintf
, um formatierten Text in den Pipe-Stream gnuplot
zu schreiben. Beachten Sie, dass Dateistreams, die mit dem Aufruf popen
geöffnet wurden, mit der Funktion pclose
geschlossen werden sollten.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int x[] = {2015, 2016, 2017, 2018, 2019, 2020};
int y[] = {344, 543, 433, 232, 212, 343};
FILE *gnuplot = popen("gnuplot", "w");
if (!gnuplot) {
perror("popen");
exit(EXIT_FAILURE);
}
fprintf(gnuplot, "plot '-' u 1:2 t 'Price' w lp\n");
for (int i = 0; i < 6; ++i) {
fprintf(gnuplot, "%d %d\n", x[i], y[i]);
}
fprintf(gnuplot, "e\n");
fprintf(stdout, "Click Ctrl+d to quit...\n");
fflush(gnuplot);
getchar();
pclose(gnuplot);
exit(EXIT_SUCCESS);
}
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook