Blog einrichten und sich selbst überlassen, Teil 2 Diagramme mit Gnuplot erstellen

Von Mirco Lang

Charts müssen nicht zwangsläufig händisch mit Excel erstellt werden, es geht wesentlich eleganter: Per Gnuplot auf der Kommandozeile, perfekt für automatisierte Anwendungen.

Firma zum Thema

Mit Gnuplot ist es möglich, Graphen und Diagramme zu zeichnen.
Mit Gnuplot ist es möglich, Graphen und Diagramme zu zeichnen.
(Bild: Lang / GNUplot)

In drei Artikeln zum vollautomatischen Blog – als Basis für eigene Entwicklungen. Am Ende des ersten Teils stand eine Liste mit Begriffen und deren Häufigkeiten, die nun in einen schicken Graphen gerendert werden sollen. Dieser zweite Teil widmet sich deshalb einem wahren Klassiker.

Gnuplot existiert bereits seit 35 Jahren. Im Bereich Wissenschaft ist Gnuplot recht bekannt; schließlich wurde es ursprünglich entwickelt, um mathematische Funktionen und Daten interaktiv präsentieren zu können (in einem interaktiven Terminal). Ein recht typisches Beispiel für den nicht-interaktiven Gnuplot-Einsatz sind Wetterdaten, wie sie zum Beispiel beim US-amerikanischen NCAR Foothills Laboratory zu sehen sind.

Die Diagramme zu Luftfeuchtigkeit, Windgeschwindigkeit und so weiter werden alle fünf Minuten aktualisiert – und so liefert die Seite ständig relevante Informationen, automatisch erhoben durch eine Wetterstation und automatisch generiert via Gnuplot. Hier wird das Programm also eingesetzt, um einige wenige fixe Grafiken schlicht aktuell zu halten.

Die Funktionsweise von Gnuplot ist grundsätzlich simpel: Im Zentrum steht eine Konfigurationsdatei, die alle nötigen Anweisungen für das Erstellen der Charts enthält, von der Größe des Bilds, über den Stil der Linien und Balken, bis hin zur Angabe der zu verarbeitenden Daten. Die Daten können zum Beispiel als CSV-Datei vorliegen oder in der Form, wie sie der erste Teil der Serie zum Textmining hervorgebracht hat:

1885 cloud
343 git
264 kubernetes
...

Separatoren wie Kommata oder hier eben Leerzeichen lassen sich in den Gnuplot-Konfigurationsdateien bestimmen; und da scheint schon durch, dass Gnuplot zwar grundsätzlich simpel sein mag, im Detail aber durchaus komplex ist. Immerhin handelt es sich bei den Konfigurationen um echte kleine Skripte, die auch mit Variablen, Makros und dergleichen umgehen können.

Um wirklich komplexe Daten in aufwändige dreidimensionale Graphen mit exakten Labels, Dimensionen, Relationen und Legenden zu verwandeln, braucht es einiges an Übung. Aber schon der Einstieg ist nicht ganz trivial, was zum einen an der doch sehr eigenständigen Herangehensweise liegt, zum anderen an der Dokumentation, die nicht immer sehr einsteigerfreundlich und ziemlich wissenschaftsfokussiert ist.

Warum es sich dennoch auch im Business-Kontext lohnt? Zum einen lassen sich schöne Install-and-Forget-Projekte aufsetzen, die zum Beispiel über geschaltete Werbung Umsätze generieren könnten. Zum anderen könnte man sich auch innerbetrieblich die eine oder andere Arbeitsstunde sparen, um grafische Auswertungen für das Management händisch mit Excel & Co. zu basteln.

Einstieg in Gnuplot

Im Folgenden zeigen wir Ihnen, wie Sie ein simples Gnuplot-Skrip aufbauen, das folgende Konzepte und Elemente beleuchtet:

  • Terminal: Canvas/Zeichenbereich
  • Object: Hintergrundfarbe
  • Xtics: X-Achsen-Beschriftung
  • Yrange: Y-Achsen-Dimension
  • Label: Frei platzierbare Beschriftung
  • Graphen
  • Legende
  • Variablen/Externe Daten

Für den Anfang soll das genügen, zumal dabei zwei wichtige Aspekte von Gnuplot klar werden, die immer wieder vorkommen: Koordinatensysteme und Alignment.

Gnuplot zeichnet die Objekte wie Pfeile und Labels auf verschiedenen Ebenen beziehungsweise in Koordinatensystemen:

  • First: Werte der X- und Y-Achse (unten, links).
  • Second: Werte etwaiger sekundärer X-/Y-Achsen (oben, rechts).
  • Screen: Der gesamte Zeichenbereich, adressiert von 0,0 bis 1,1.
  • Graph: Der Bereich im Graphen, adressiert von 0,0 bis 1,1.
  • Character: Positionierung auf dem Canvas unter Verwendung der aktuellen Font-Höhe.

Die Adressierung von 0,0 bis 1,1 meint dabei schlicht „von unten links bis oben rechts“, so dass „0.5,0.5“ entsprechend die Mitte definiert.

Beim Platzieren von Elementen in diesen Koordinatensystemen können Sie jeweils angeben, welcher Punkt des Elements auf den gegebenen Koordinaten liegen soll, also das Alignment festlegen: left, center, right.

Ein links ausgerichtetes Label „label 1“ in der Mitte des Graphen würde entsprechend so aussehen:

set label 1 „Mein beliebiger Text“ left at graph 0.5, graph 0.5

Labels in diversen Koordinatensystemen.
Labels in diversen Koordinatensystemen.
(Bild: Lang / GNUplot)

Um das Ganze zumindest ein wenig zu verdeutlichen, hier mal ein Plot mit je einem über jedes Koordinatensystem platzierten Label, der Text entspricht dabei der Platzierung:

set label 1 "at FIRST 3, 23.1" left at first 3, first 23.1
set label 2 "at SECOND 3, 22" left at second 3, second 22
set label 3 "at GRAPH 0.5, 0.5" left at graph 0.5, graph 0.5
set label 4 "at SCREEN 0.5, 0.48" left at screen 0.5, screen 0.48
set label 5 "at CHARACTER 35, 20" left at character 35, character 20

Gnuplot-Beispiel

Wenn das etwas gewöhnungsbedürftige Konzept der Koordinatensysteme klar ist, fällt die weitere Konfiguration recht leicht; im Grunde eine reine Liste von set-Anweisungen, um Eigenschaften für Objekte zu setzen. Bevor wir zum Skript (artikel.gnu) kommen, hier zunächst die Daten (artikel.dat) und das fertige Bild:

Balkendiagramm mit Legende und Erstelldatum.
Balkendiagramm mit Legende und Erstelldatum.
(Bild: Lang / GNUplot)

artikel.dat:

40 a

35 b

30 c

26 d

24 e

22 f

22 foobar

Der gesamte Code für diese Grafik sieht so aus:

set terminal png size 960,700 enhanced font "Helvetica,15"
set object 1 rectangle from screen 0,0 to screen 1,1 fillcolor rgb"#D5D8DC" behind
set xtics rotate by 70
set xtics right
set bmargin 5
set xtics font "Helvetica,12"
set boxwidth 0.3
set style fill solid
set key font "Helvetica,15"
set key over title "Die Legende"
set yrange [0:]
date = system("date +%d.%m.%Y")
set label 1 "Erstellt am ".date."." center at screen 0.5, screen 0.01 font "Helvetica,7"
plot "artikel.dat" using 1:xtic(2) with boxes lc rgb "#E85B19" title "Testing"

Positionen der Gnuplot-Elemente.
Positionen der Gnuplot-Elemente.
(Bild: Lang / GNUplot)

Die meisten Elemente lassen sich am besten grafisch erläutern, hier nochmal dieselbe Grafik mit Annotationen.

Die Reihe an set-Anweisungen dürfte weitgehend selbsterklärend sein, zunächst werden Zeichenbereich und Hintergrund erzeugt (terminal und object). Beim Hintergrund, einem Rechteck in Grau, sehen Sie auch nochmal das Aufspannen über das gesamte screen-Koordinatensystem von links unten bis nach rechts oben, also „0,0 bis 1,1“.

Folgend werden X-Achsen-Beschriftung, Layout der Balken, Schriftgrößen und Legende konfiguriert. Interessant ist dann erst wieder „set yrange [0:]“. Damit wird der Wertebereich der Y-Achse auf Null am unteren Ende und „automatisch“ (keine Angabe) am oberen Ende gesetzt; einen festen Bereich würde man etwa mit „set yrange [0:40]“ bekommen.

Es folgt die Variable „date“: Über das Gnuplot-Kommando „system“ lassen sich beliebige Kommandos in der System-Shell ausführen, um das Ergebnis etwa in eine Variable einzuspeisen – hier mit dem schlichten Zweck, ein automatisches Erstelldatum ins Bild einzufügen. Bedenkt man nun, dass Gnuplot auch if-Abfragen ermöglicht [http://gnuplot.sourceforge.net/docs_4.2/node96.html], ergeben sich schnell viele Möglichkeiten!

Die Variable selbst kann dann ohne jegliche Deklaration zum Beispiel als Text im label-Element verwendet werden. Über Punkte werden manueller Text und Variable konkateniert: „foo“.VARIABLE.“bar“

Im Grunde könnten all diese Vorgaben für Plots aber auch in einer config-Datei „~/.gnuplot“ hinterlegt werden, der eigentliche Befehl zum Plotten folgt zum Schluss:

plot "artikel.dat" using 1:xtic(2) with boxes lc rgb "#E85B19" title "Testing"

Hier wird die zu verarbeitende Daten-Datei (artikel.dat) festgelegt, wie gerendert werden soll, hier also mit Balken (boxes) in der angegebenen RGB-Linienfarbe (lc/line color) und mit dem gesetzten Titel. Wichtig ist hier aber insbesondere „using 1:xtic(2)“: using wird verwendet, um gezielt auf Daten innerhalb der Daten-Datei zuzugreifen oder diese zu manipulieren (etwa Summenbildung). In diesem Fall wird zunächst der Y-Wertebereich angegeben, also Spalte 1. Dann wird die Beschriftung für die X-Achse (xtic) festgelegt, hier Spalte 2.

Angenommen die Daten würden so aussehen:

11 foo 33
22 bar 66

Dann ließe sich der plot-Befehl auch so nutzen:

plot „artikel.dat“ using 3:xtic(2)

Damit würden die Balken dann aus den Werten der Spalte 3 generiert. Weitere Beispiele für die using-Syntax liefert die GNUplot-Dokumentation. Mit dem bisherigen Grundverständnis dürften Sie sich im Handbuch auch schnell zurechtfinden.

Mit den bis hierher gezeigten Elementen lassen sich bereits viele nützliche und ansehnliche Diagramme schaffen, aber wie erwähnt: Gnuplot kann noch wesentlich mehr leisten, unter anderem über Berechnungen, den Einsatz externer Skripte und vor allem den gezielten Zugriff auf deutlich komplexeres Zahlenmaterial; selbst Animationen und interaktive Grafiken sind möglich.

Im nächsten Teil der Serie werden dann die erstellten Grafiken automatisch über ein textbasiertes Content-Management-System skriptgesteuert publiziert, nämlich das minimalistische und natürlich quelloffene Pico.

(ID:47710898)