So zeichnen Sie Daten in C

Jinku Hu 12 Oktober 2023
  1. Verwenden Sie die Funktion gnuplot, um die Anzeige für das Dateiende im Dateistream zu überprüfen
  2. Verwenden Sie die Funktion popen, um Plotdaten an den Prozess gnuplot zu streamen
So zeichnen Sie Daten in C

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);
}
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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