Umgang mit zeitbasierten Daten mit Gnuplot

Gnuplot ist meiner Meinung nach eines der besten Open-Source-Tools zum Zeichnen von Diagrammen unter Linux. Ich mag es weil:

  • Es ist ein Befehlszeilenprogramm
  • Es erkennt Befehle, die reine Textzeichenfolgen sind
  • Es liest die Zahlen im Nur-Text-Format aus Nur-Text-Dateien

Mit anderen Worten, ich mag Gnuplot, weil es die automatische Erstellung von Diagrammen so einfach wie möglich macht: Sie können sowohl Daten- als auch Gnuplot-Befehle im laufenden Betrieb mit einem beliebigen Programm oder einer beliebigen Programmiersprache generieren und diese dann an Gnuplot übergeben.

Mit Ausnahme von Kreisdiagrammen (es sei denn, Sie wenden einige Tricks an) kann Gnuplot praktisch jede Art von Diagramm zeichnen ... wenn Sie wissen, welche Optionen Sie verwenden müssen. Hier werde ich nur die wenig bekannten erläutern, mit denen Gnuplot bestimmte Zeichenfolgen als absolute Daten oder Stunden erkennen und folglich zeitbezogene Daten ordnungsgemäß darstellen kann.

Nehmen wir an, Sie haben eine Datendatei ("datafile.dat") wie folgt:

20110101 30

20110108 21

20110115 28

20110122 3

20110129 6

20110205 9

20110212 12

20110219 25

20110226 22

20110305 18

20110312 37

20110319 37

20110326 32

20110402 41

20110409 35

20110416 26

20110423 27

20110430 20

Ein Mensch würde sofort verstehen, dass die Zahlen in den ersten Spalten sehr wahrscheinlich Datumsangaben sind. Gnuplot hingegen nicht. Zumindest nicht von alleine. Wenn Sie ihm nur sagen, dass er die Datei mit den folgenden Anweisungen zeichnen soll:

 Stellen Sie die Klemmen-PNG-Größe 900, 300 ein 
 setze Ausgabe "chart_1.png" 
 plot : : 'datafile.dat' mit 1: 2-Titel "Dies erhalten Sie, wenn gnuplot keine Zeitwerte erkennt" mit Zeilen 
Wenn Sie also die erste Spalte für die X-Achse und die zweite für die Y-Achse verwenden, erhalten Sie das Diagramm in Abbildung A : "20110101" wird nicht als "1. Januar 2011", sondern als "zwanzig Millionen etwas" erkannt. .. "Wirklich hässlich und unlesbar, nicht wahr?

Abbildung A.

Die Lösung besteht darin, die Variablen xdata und timefmt von Gnuplot festzulegen, indem Sie diese Befehle direkt vor der Plotanweisung hinzufügen:

 Stellen Sie die xdata-Zeit ein 
 setze timefmt "% Y% m% d" 

Der erste sagt Gnuplot, dass die Zahlen auf der X-Achse Zeitwerte sind. Der zweite erklärt, wie sie formatiert sind. In unserem Beispiel lautet das Format JJJJMMTT, es kann jedoch auch viele andere Werte haben, die alle in der Dokumentation beschrieben sind (dazu später mehr). In der Praxis gibt es hier nur zwei Einschränkungen. Das erste ist, dass nur ein Zeit- / Datumseingabeformat pro Plot unterstützt wird. Das andere ist, dass die Spalten in der Datendatei durch Tabulatoren anstelle von Leerzeichen getrennt werden müssen, damit Gnuplot problemlos Werte mit Leerzeichen verarbeiten kann, z. B. "2011/06/02 11:18".

Zurück zum Plotten. Führen Sie Gnuplot mit den neuesten Einstellungen aus und siehe da! Die Nummern der ersten Spalte werden als solche erkannt und entsprechend gedruckt, wie in Abbildung B dargestellt .

Abbildung B.

Viel besser jetzt, nicht wahr? Wir können es jedoch noch besser machen. Glücklicherweise sind die Art und Weise, wie die Zeitwerte in der Datendatei formatiert werden und wie sie im Plot gedruckt werden, völlig unabhängig. Die bereits gesehene Variable timefmt gibt an, wie die Zeitspalte in der Datendatei gelesen werden soll. Timefmt erkennt viele Formate:% j gibt beispielsweise den Tag des Jahres im Format 1 bis 365 und% B den Monatsnamen an (auf Englisch!). Um mehr über alle Funktionen von timefmt zu erfahren, geben Sie gnuplot in ein Terminal ein und helfen Sie dann beim Festlegen von timefmt .

Das andere, was Sie wissen müssen, um lesbare zeitbasierte Diagramme zu zeichnen, ist, wie Sie Bereiche zeichnen und Tics auf der Zeitachse anzeigen, um genau zu zeigen, was Sie, nicht Gnuplot, für relevant halten.

Wenn Sie nur einen bestimmten Wertebereich aus der Datendatei zeichnen möchten, geben Sie ihn an, indem Sie den x-Bereich auf dasselbe Format einstellen, das von timefmt verwendet wird, dh das in der ursprünglichen Datendatei:

 setze xrange "20110402": "20110430" 
Auf diese Weise wird ein "eingeschränktes" Diagramm wie in Abbildung C dargestellt .

Abbildung C.

Einstellungsnummer, Positionen und Namen der Tics sind etwas komplizierter, aber nicht so sehr. Die Namen werden entweder durch explizite Auflistung oder durch Zuweisen eines Formats zur Variablen xtics festgelegt. Dies zum Beispiel:

 setze xtics Format "% b% d" 
bedeutet, dass Gnuplot den abgekürzten Monatsnamen (% b) und den Tag des Monats (/% d) verwenden sollte, um Tics wie "20. Januar", "11. März" usw. zu drucken. Position und Anzahl der Tics können auf verschiedene Arten gesteuert werden. Am flexibelsten ist es, xtics einen Start- und einen Endwert sowie die Anzahl der Sekunden zwischen zwei aufeinander folgenden Tics zuzuweisen. Nehmen wir zum Beispiel an, wir möchten mittwochs alle zwei Wochen einen Tic anzeigen. Da der erste Mittwoch im Jahr 2011 der 5. Januar war und in zwei Wochen 60 x 60 x 24 x 7 x 2 = 1209600 Sekunden vorhanden sind, können Sie wie folgt zeichnen, was Sie in Abbildung D sehen :
 Raster einstellen 
 setze xtics Format "% b% d" 
 setze xtics "20110105", 1209600, "20110430" 

Abbildung D.

Cool, oder? Bitte beachten Sie, dass "Set Grid" nicht erforderlich war. es macht es einfach einfacher zu sehen, dass die Tics genau dort erscheinen, wo sie sollten. Das einzige Problem dabei ist, sich daran zu erinnern, dass Sie Start- und End-Tics in dem Format angeben müssen, in dem sie in der Quelldatei ("20110105") angezeigt werden, nicht in dem im Plot gezeigten ("Jan 05").

Zusammenfassen

Diagramme zeitbasierter Daten sind in vielerlei Hinsicht äußerst nützlich für Arbeit und Studium. Hier habe ich alles erklärt, was Sie wahrscheinlich wissen müssen, um Gnuplot zu verwenden, um solche Daten zu verstehen. Falls dies nicht ausreicht, finden Sie weitere Informationen in der Gnuplot-Dokumentation, indem Sie an der Eingabeaufforderung Hilfezeit / -datum eingeben oder xtics festlegen .

© Copyright 2021 | mobilegn.com