Meist plottet man Daten in hochauflösenden Grafiken. Mit Lowcharts und Konsorten sorgen Sie im Terminal für ansprechende Linien-, Balken- und Kuchendiagramme.
Grafiken ermöglichen eine eingängige Anzeige von Daten. Verfügt ein System aber lediglich über begrenzte Möglichkeiten in Bezug auf die Ausgabegeräte, brauchen Sie andere Werkzeuge als die gängige Tabellenkalkulation. Farbige Grafiken und Diagramme lassen sich durchaus auch im Terminal erstellen.
Werkzeuge, die Bilder im Terminal anzeigen, wandeln zunächst die Bilddaten in ASCII- oder Unicode-Zeichen sowie ANSI-Farbcodes um und geben diese anschließend im Terminal aus [1]. Solche Lösungen haben wir schon in früheren Ausgaben vorgestellt [2]. Diesmal geht es aber um die Frage, wie man Daten ohne Umwandeln von PNG nach ASCII/Unicode im Terminal plottet. Welche Diagrammtypen lassen sich so umsetzen, und wie ergänzt man sie um Zusatzinformationen?
Die Antwort lautet: Mit den passenden Tools geht fast alles. Sie benötigen lediglich ein Terminal, das die passenden Zeichensätze und Farbe unterstützt sowie entsprechende Werkzeuge und Bibliotheken.
Einsatzgebiet
Zunächst einmal stellt sich jedoch die Frage nach dem Warum – schließlich sind grafische Oberflächen und entsprechende Programme schon seit Jahren Standard auf dem PC.
Das gilt allerdings nur für Desktop-Rechner; bei Servern, insbesondere bei solchen mit anderen Prozessorarchitekturen als x86, sieht das schon ganz anders aus. Hier hilft ein schneller ASCII-Plot, sich einen groben Überblick über gesammelte Daten zu verschaffen, vor allem, wenn Sie das System nur via SSH erreichen, aber trotzdem eine Grafik nutzen wollen.
Mitunter bieten auch Prozessor oder Display nur begrenzte Möglichkeiten, etwa wenn Sie Linux auf dem Mikrocontroller eines Embedded-Systems ausführen [3] und darauf für eine grafische Ausgabe auf der Basis des X-Window-Systems kein Platz mehr bleibt.
Werkzeugübersicht
Ausgangspunkt für die Recherche war das Lowcharts-Projekt [4], das vielfältige Funktionen mitbringt. Stück für Stück kamen weitere Werkzeuge und Bibliotheken hinzu. Die Tabelle “Tools im Überblick” vermittelt einen Überblick und listet Werkzeuge auf, die eine solche Ausgabe zum einen möglich machen (etwa als zusätzliche Variante) und sich zum anderen dazu eignen, um Daten im Terminal zu plotten.
|
Generalist |
Gnuplot [10] |
|
Spezialisten |
Lowcharts [4], Asciichart [11], Plotext [12], Plotille [13], Termgraph [14], Ervy [15], Terminal-bar [16] |
|
Bibliotheken |
Die Liste ist nicht vollständig. Kennen Sie weitere Werkzeuge, die hier noch fehlen, freut sich der Autor auf Ihr Feedback. Außen vor bleiben GNU Octave [5] und SageMath [6], die ausschließlich eine grafische Ausgabe unterstützen.
Gnuplot
Der Veteran Gnuplot gilt seit Langem als ausgereift und äußerst vielfältig. Viele kennen den grafischen Modus mit einer umfassenden Liste an Kommandos. Dass das Programm aber zusätzlich die Ausgabe via Text unterstützt, fällt oft unter den Tisch.
Bei Gnuplot bauen Sie die Plots aus einzelnen Befehlen zusammen, die das Programm dann Schritt für Schritt interpretiert [7]. Für eine Ausgabe als ASCII-Zeichen sorgt das Kommando set terminal dumb (Listing 1).
Listing 1
Liniendiagramm mit Gnuplot
set terminal dumb set datafile separator "," plot "diagrammdaten.csv" with lines
Abbildung 1 zeigt eine Beispielausgabe für Daten, die als kommaseparierte, ganzzahlige Werte in der Datei diagrammdaten.csv vorliegen. In den Tests plottete Gnuplot fast alle Diagrammtypen auch im Terminal. Eine farbige Ausgabe beherrscht die Software jedoch nicht, die Grafiken bleiben schwarz-weiß.

Abbildung 1: Gnuplot verfügt über einen Modus, mit dem Sie Daten im Terminal in Form von ASCII-Zeichen ausgeben.
Lowcharts
Mehr Farbe bringt Lowcharts ins Spiel. Das in Rust [8] programmierte Werkzeug steht über die Projektseite auf Github zum Download bereit. Im Test kam Version 0.4.2 zum Einsatz. Nach dem Übersetzen aus dem Quelltext mittels make release erzeugte es wie gewünscht die Diagramme. Die Tabelle “Kommandos” listet auf, mit welchen Parametern Sie die jeweilige Ausgabe erzeugen.
|
|
Histogramm mit den gebräuchlichen Angaben |
|
|
einfaches Histogramm |
|
|
Balkendiagramm mit Häufigkeitsverteilung |
|
|
2D-Graph, Y-Werte bilden den Durchschnitt der Eingabewerte |
|
|
Histogramm basierend auf der Trefferanzahl, Aufteilung nach der Trefferanzahl |
|
|
Histogramm basierend auf der Trefferanzahl |
Die beiden nachfolgenden Beispiele erzeugen Balkendiagramme. Grundlage bilden die Log-Dateien der Paketverwaltung. Das Diagramm zeigt, wie viele Aufrufe zu Installationen, Aktualisierungen und Entfernungen von Paketen stattgefunden haben (Abbildung 2). Für den Aufruf kommt das Unterkommando matches zum Einsatz, auf das die vier Schlüsselworte Update Upgrade Install Remove folgen.

Abbildung 2: Füttern Sie Lowcharts mit den Daten zu Aktualisierungen sowie Installationen und Deinstallationen, erstellt es mit dem passenden Aufruf daraus einen Graphen.
Lowcharts zählt daraufhin alle Zeilen, in denen eines der Schlüsselworte vorkommt, und erzeugt daraus ein Balkendiagramm, wobei es jedem Begriff einen Balken zuordnet. Über der Ausgabe steht die Summe aller Treffer sowie die Information, wie viele Treffer ein rotes Quadrat repräsentiert (hier: 1 Quadrat pro Treffer).
Andere Unterkommandos erzeugen statistische Auswertungen der Daten, erfordern aber aufgrund der überschaubaren Dokumentation des Werkzeugs einige Experimente. Der Einsatz regulärer Ausdrücke sah in der Dokumentation spannend aus, führte jedoch im Test zu keinen brauchbaren Ergebnissen.
Daher zeigt das zweite Beispiel nur eine Auswertung einer Datendatei mit erfassten Werten und deren Häufigkeit (Abbildung 3) mittels des Unterkommandos hist. Über den Schalter --intervals 5 legen Sie fest, dass die Ausgabe nur fünf Zeilen umfasst.
Alternativen
Bei Bashplotlib, Termplotlib, Plotext, Termgraph und Plotille handelt es sich um kleine Python-Module, die alle sehr ähnlich funktionieren. Haben Sie Bashplotlib via Pip lokal installiert, steht es ohne weiteren Aufwand über die beiden Werkzeuge Hist und Scatter bereit. Das nachfolgende Beispiel benutzt die bereits zuvor in Abbildung 3 verwendeten Daten und generiert damit ein kleines Diagramm mittels Hist. Im Aufruf kommt zusätzlich die Option -t zum Tragen, die das Diagramm um einen Titel ergänzt (Abbildung 4).

Abbildung 4: Die Ausgabe mit Bashplotlib vermittelt ebenfalls auf den ersten Blick alle wichtigen Informationen aus den Daten.
Terminal-bar ähnelt Bashplotlib, die Art und Weise der Ausgaben beider Tools unterscheidet sich nicht groß. Plotext, Plotille und Termgraph weisen hingegen Parallelen zu Matplotlib [9] auf. Asciichart fällt in dieselbe Werkzeugkategorie, setzt aber nicht auf Python auf, sondern stattdessen auf Javascript und eignet sich damit zur Integration in eine Webseite.
Ervy benutzt ebenfalls Javascript. Es bietet mehr Möglichkeiten als Asciichart und glänzt durch Balken- und Tortendiagramme sowie verschiedene Ladebalken. Abbildung 5 zeigt die unterschiedlichen Balkentypen, die Ervy kennt.

Abbildung 5: Balkendiagramme lassen sich mit Ervy schnell erstellen. Dank Javascript als Grundlage für die Software wäre eine Integration in eine Webseite möglich.
Fazit
Ein Plot im Terminal ist keine Hexerei. Die Vielfalt der Bibliotheken und Werkzeuge erlaubt das Andocken und Integrieren in nahezu jeden Workflow auf der Kommandozeile. Bei den gängigen Distributionen fehlen die vorgestellten Werkzeuge oft in den Paketquellen, sodass ihr Einsatz etwas Handarbeit voraussetzt. Das sollte aber kein großes Hindernis darstellen, da sich der Aufwand für das Kompilieren der Werkzeuge in engen Grenzen hält. (agr)
Danksagung
Der Auto bedankt sich bei Harald König für Rat und Anmerkungen beim Erstellen des Artikels, insbesondere zu Gnuplot.
Über den Autor
Frank Hofmann arbeitet zumeist von unterwegs aus als Entwickler, Trainer und Autor. Seine bevorzugten Arbeitsorte sind Berlin, Genf und Kapstadt. Er gehört zu den Verfassern des Buchs zum Debian-Paketmanagement.
Infos
-
Fonts für Programmierer: Axel Beckert, Frank Hofmann, “Form follows function”, LU 05/2021, S. 61, https://www.linux-community.de/46063
-
Aalib/Libcaca: Axel Beckert, Frank Hofmann, “Eingebildet”, LU 01/2021, S. 28, https://www.linux-community.de/45555
-
Embedded Linux: https://jaycarlson.net/embedded-linux/
-
Lowcharts: https://github.com/juan-leon/lowcharts/
-
GNU Octave: https://octave.org
-
SageMath: https://www.sagemath.org
-
“Plotting Data”: https://www.datafix.com.au/BASHing/2019-06-21.html
-
Matplotlib: https://matplotlib.org
-
Gnuplot: http://www.gnuplot.info
-
Asciichart: https://github.com/kroitor/asciichart
-
Plotext: https://github.com/piccolomo/plotext
-
Plotille: https://github.com/tammoippen/plotille
-
Termgraph: https://pypi.org/project/termgraph/
-
Terminal-bar: https://github.com/nabraham/terminal-bar
-
Termplotlib: https://github.com/nschloe/termplotlib
-
Bashplotlib: https://github.com/glamp/bashplotlib






