Multiplot-Diagramme in Gnuplot

Gnuplot ist ein schönes Programm, um anspruchsvolle Diagramme zu erzeugen, die so unter LibreOffice, Excel & Co. nicht bzw. nur mit viel Aufwand möglich sind. Nachteil des Programms: man braucht einige Zeit, um sich mit den Befehlen vertraut zu machen. Daher möchte ich hier meine Erfahrungen beim Erstellen eines Multiplot-Diagramms teilen.

Zum besseren Verständnis vielleicht erstmal das Ergebnis, wie das Diagramm am Ende aussehen soll:

Multiplot-Diagramm, erstellt mit gnuplot
So soll das Diagramm am Ende aussehen

Dargestellt werden Unterschiede im Bodenwassergehalt zu einer bestimmten Variante. Da Werte für unterschiedliche Tiefenbereiche vorliegen, sollen diese untereinander angeordnet sein, wobei die x-Werte natürlich immer gleich sein sollen.

Die Plot-Datei und die Daten dazu können am Ende des Artikels heruntergeladen werden. Nun zu den Einzelheiten der Plot-Datei:

 

1. Formatierung der Achsen

set encoding utf8

Die Datei beginnt mit dem Setzen der Codierung. Mit der UTF-8-Codierung stellt man sicher, dass Umlaute später in der Ausgabe als EPS-Datei richtig dargestellt werden.

set xdata time
set x2data time
set timefmt "%d/%m/%y"
set xrange ["01/04/08":"1/10/09"]
set x2range ["01/04/08":"1/10/09"]

Mit diesem Block legt man das Format der x-Achsen fest. Die erste und zweite Zeile sorgen dafür, dass das Format der primären bzw. sekundären x-Achse ein Zeitformat ist. Darauf folgt die Anweisung, wie das Zeitformat in der Datendatei aussieht: nämlich in der Form „10/11/09“. Die letzten beiden Zeilen geben die Skalierung beider x-Achsen an. Da die sekundäre x-Achse nur zur besseren Visualisierung beschriftet werden soll, ist die Skalierung die Gleiche wie bei der primären x-Achse.

set yrange [-50:40]
set ytics -40,10,30

Weiter geht es mit der Formatierung der y-Achse. Für alle Diagramme soll die Achse zwischen -50 und 40 skaliert sein. Mit der 2. Zeile wird festgelegt, welche Werte beschriftet werden sollen: Die Beschriftung soll bei -40 beginnen, alle 10 Einheiten soll ein Wert stehen und bei 30 aufhören. Dadurch verhindert man dann unschöne Überlagerungen an den Enden der Achsen der einzelnen Diagramme, wo sich ansonsten die Zahlen -50 als unterste Zahl des oberen und 40 als oberste Zahl des darunterliegenden Diagramms überschneiden würden.

 

2. Definition der Ränder 

set tmargin 0
set bmargin 0
set lmargin 10
set rmargin 5

Mit diesem Block werden die Abstände der Diagramme festgelegt: Die ersten beiden Zeilen legen oberen (tmargin) und unteren (bmargin) Abstand fest. Da zwischen den Diagrammen keine Lücken sein sollen, sind diese Abstände auf 0 gesetzt. Die linken (lmargin) bzw. rechten (rmargin) Abstände haben einen Wert zugewiesen bekommen, damit a) Platz für Achsbeschriftungen geschaffen wird und b) die y-Achsen der einzelnen Diagramme bündig übereinander liegen.

 

3. Definition der grafischen Ausgabe

set terminal postscript eps enhanced color fontfile '/usr/share/texmf/fonts/type1/public/cm-super/sfrm1000.pfb' "SFRM1000" size 16cm,20cm
set output "multiplot.eps"

Dieser Block wird nur benötigt, wenn man das Diagramm gleich als EPS abspeichern möchte. Dies ist u.a. für alle diejenigen interessant, die die Abbildung in LaTeX integrieren wollen. Mit set terminal postscript eps  gibt man die Ausgabe des Plots an, hier Encapsulated PostScript. Eine Auflistung aller anderen Ausgabemöglichkeiten (u.a. PDF, JPEG, PNG, LaTeX) findet man in der Dokumentation zu gnuplot auf deren Homepage. Mit der Option enhanced können auch Sonderformen wie griechische Buchstaben etc. in das EPS eingebettet werden. Die Option color bewirkt, dass die angegebenen Farben auch im EPS verwendet werden, da als Standard monochrome gesetzt ist. Mit der Option fontfile und dem dazugehörigen Pfad wird eine Schrift festgelegt, die im EPS verwendet werden soll. In diesem Fall ist es die Standardschriftart von LaTeX-Dokumenten (s. Tipp am Ende des Artikels). So bettet sich die Grafik dann auch optisch gut in diese ein. Diese Option ist allerdings nicht zwingend erforderlich, wenn man es nicht möchte. Mit der Option size legt man die Abmessungen der EPS-Datei fest. Diese sind standardmäßig auf 5×3,5 inch gesetzt.

In der 2. Zeile wird der Name der Ausgabedatei festgelegt.

 

4. Definition von Linienstilen

set style line 1 lt 1 lc rgb "orange-red" lw 2
set style line 2 lt 1 lc rgb "orange"
set style line 3 lt 1 lc rgb "dark-yellow"
set style line 4 lt 1 lc rgb "web-green"
set style line 5 lt 1 lc rgb "red"
set style rect fc rgb "light-pink" fs solid 0.3 noborder back

In diesem Block wird das Aussehen der später zu verwendeten Linien bestimmt. Die Zahl nach set style line ist die ID des jeweiligen Stils. Sie kann man frei wählen. Die Option lt 1 legt den Linientyp fest, hier eine durchgezogene Linie. Weitere Typen können auf den Demoseiten von gnuplot gefunden werden. Die Option lc rgb „Farbname“ steht für „linecolor“ und legt die Farbe der Linien fest. Mit lw 2 wird die Dicke einer Linie bestimmt (linewidth). Standardmäßig ist diese auf 1 gesetzt.

In der letzten Zeile wird das Aussehen der rosa hinterlegten Vegetationsperiode bestimmt. Diese wurden durch Rechtecke (rect) realisiert. Die Option fc erfüllt den gleichen Zweck wie lc (fillcolor). Mit fs legt man die Füllung fest. In diesem Fall werden die Rechtecke flächenhaft mit hellpink gefüllt. Die Farbe wird durch das setzen einer Transparenz (die 0.3 hinter solid) abgeschwächt. Die Rechtecke sollen keinen Rahmen haben (noborder) und hinter allen anderen Daten liegen (back).

 

5. Definition von Hintergründen

set object rect from graph 0, graph 0 to "02/07/08", graph 1
set object rect from "08/08/08", graph 0 to "20/01/09", graph 1
set object rect from "17/04/09", graph 0 to "28/09/09", graph 1
set grid front

In diesem Block werden dann die drei Vegetationsperioden gezeichnet. Es wird der linke untere und der rechte obere Eckpunkt des Rechtecks angegeben (erst x-, dann y-Wert). Die Option graph ist notwendig, um mitzuteilen, dass die angegebenen Koordinaten sich auf das jeweilige Einzeldiagramm beziehen und nicht auf die Gesamtausgabe (dann müsste man statt graph den Befehl screen nehmen).

Mit der letzten Zeile wird das Gitternetz nach vorne geholt, damit es über allen Linien und Rechtecken liegt.

 

6. Definition des Grundlayouts des Diagramms 

set multiplot layout 8,1 title "Differenz des Bodenwassergehaltes zur Variante Anin verschiedenen Tiefebereichen" offset 0,-0.03
set key center horizontal at screen 0.5, 0.04 spacing 1.5

Nun wird (endlich) mit dem Zeichnen der eigentlichen Diagramme begonnen. Mit set multiplot setzt man eine Umgebung, in der man mehrere Diagramme anordnen kann. Mit layout 8,1 wird mitgeteilt, dass das Layout des Multiplots aus 8 Zeilen und 1 Spalte bestehen soll. Die 8. Zeile im Layout wird benötigt, um Platz für Legende und Achsenbeschriftung zu haben (es sind ja eigentlich nur 7 Einzeldiagramme). Die title-Option ist, denke ich, klar und mit der offset-Option werden die einzelnen Diagramme alle um den angegebenen Betrag verschoben. Hier war es notwendig, da sich sonst die Beschriftung der sekundären x-Achse und der Diagramm-Titel überlagert hätten. Kurze Anmerkung: Der Parameter n im Titel sorgt für einen Zeilenumbruch.

Set key sorgt für das Setzen einer Legende, hier wird die Legende des ersten Diagramms dargestellt. Mit der Option center wird eine zentrierte Ausrichtung erreicht, die Option horizontal sorgt dafür, dass die Legendeneinträge zunächst in mehreren Spalten angeordnet wird. Erst wenn alle Spalten voll sind, wird eine neue Zeile begonnen. Mit at screen 0.5, 0.04 wird die Position der Legende bestimmt. Die Legende wird normalerweise innerhalb des Diagramms gesetzt. Da sie aber für alle restlichen Diagramme mit gültig ist bzw. sein soll, wird sie mit dieser Option an den angegebenen Koordinaten der Grafik (nicht des Diagramms!) unterhalb aller Diagramme positioniert.

 

7. Erstes Teildiagramm

### Graph 1: 0-20 cm ###
set format x2 "%d.%m.%y"
set format x ""
set format y
set ylabel " "
set label 1 "0-20 cm" at graph 1.0, graph 0.5 rotate by 90 center offset 1,0
set label "Wintergerste" at graph 0.08, graph 0.83 center textcolor lt 1
set label "Zwischenfrucht" at graph 0.38, graph 0.83 center textcolor lt 1
set label "Körnermais" at graph 0.83, graph 0.83 center textcolor lt 1
plot "Feuchtediff.dat" using 1:20 with boxes fc rgb "light-red" fs solid 0.3 noborder title "Vegetationsperiode",
     "Feuchtediff.dat" using 1:20 with boxes fs solid 1 noborder fc rgb "medium-blue" title "Niederschlag",
     "Feuchtediff.dat" using 1:20 with lines ls 5 title "Tagesdurchschnitts-ntemperatur",
     "Feuchtediff.dat" using 1:20 with lines ls 1 title "Variante A",
     "Feuchtediff.dat" using 1:2 with lines ls 2 title "Variante B",
     "Feuchtediff.dat" using 1:8 with lines ls 3 title "Variante C",
     "Feuchtediff.dat" using 1:14 with lines ls 4 title "Variante D"
unset label

In diesem Block wird das oberste Diagramm gezeichnet. Mit einer # werden alle Zeichen danach in der gleichen Zeile als Kommentar gekennzeichnet und vom Programm nicht weiter interpretiert. Mit der 2. Zeile wird bestimmt, dass die sekundäre x-Achse im angegebenen Format beschriftet werden soll. In Zeile 3 wird dem Programm durch den fehlenden Inhalt zwischen den Anführungszeichen gesagt, dass keine Beschriftung der primären x-Achse stattfinden soll. In Zeile 4 wird angegeben, dass die y-Achse beschriftet werden soll. Eine Bezeichnung für diese Achse wird nicht vergeben (Zeile 5).

In Zeile 6 wird die Beschriftung des Diagramms um 90 Grad gedreht gesetzt. Mit der offset-Option verschiebt man sie außerhalb des Diagramms.

Die Zeilen 7-9 setzen die Bezeichnung der einzelnen Vegetationsperioden innerhalb des Diagramms. Mit textcolor lt 1 wird die Schrift rot gefärbt.

In den Zeilen 10-16 werden dann die eigentlichen Linien gezeichnet. Die Zeilen 10 und 11 dienen dabei nur als Dummy-Reihe, damit die Symbole für Vegetationsperiode und Niederschlag auch in der Legende erscheinen. Sie haben den Wert 0 (s. die zugehörige Datendatei), damit sie im Diagramm nicht auftauchen. Der Befehl plot gibt die Datenreihen aus. In den Anführungszeichen dahinter steht die Datendatei (hier im gleichen Verzeichnis wie die Plot-Datei). Mit using x:y wird angegeben, welche Spalte in der Datendatei für die x- und y-Werte genutzt wird. Mit with lines werden die Werte als Linien, mit with boxes als Balken/Säulen dargestellt.

Bei den Säulendarstellungen wird, wie weiter oben bereits erwähnt, mit fc und fs Farbe (fillcolor) und Stil (fillstyle) bestimmt. Bei den Linien wird mit ls und der entsprechenden ID dann die oben definierten Linienstile angewendet. Will man mehrere Daten in ein Diagramm zeichnen, leitet man mit dem , am Ende einer Zeile eine neue Datenreihe innerhalb des Plot-Befehls ein.

Die Zeile 17 setzt die in Zeile 7-9 definierten Labels zurück, damit sie in den folgenden Diagrammen nicht erneut gezeichnet werden.

 

8. Restliche Teildiagramme

### Graph 2: 20-40 cm ###
set format x2 ""
set label 1 "20-40 cm" at graph 1.0, graph 0.5 rotate by 90 center offset 1,0
unset key
plot "Feuchtediff.dat" using 1:20 with lines ls 1 title "A",
     "Feuchtediff.dat" using 1:3 with lines ls 2 title "B",
     "Feuchtediff.dat" using 1:9 with lines ls 3 title "C",
     "Feuchtediff.dat" using 1:15 with lines ls 4 title "D"

Der Befehl set hat die Eigenschaft, dass er sich auch auf alle folgenden Diagramme auswirkt, wenn er nicht durch unset aufgehoben wird oder durch ein erneutes set geändert wird. Dadurch wird der Inhalt der folgenden Diagramme übersichtlicher. Im Diagramm 2 müssen wir somit angeben, dass die sekündäre x-Achse nun nicht mehr beschriftet werden soll (Zeile 2) und das mit unset key verhindert werden soll, dass erneut eine Legende gezeichnet wird. Natürlich müssen auch die Linien sowie die Beschriftung angepasst werden.

Das Diagramm 3 benötigt nur noch Angaben zur Bezeichnung und den darzustellenden Linien. Im Diagramm 4 wird folgende Zeile hinzugefügt:

set ylabel "Differenz des Bodenwassergehalts [mm]" offset 0,5

Dadurch wird eine Bezeichnung für die y-Achse ausgegeben, die ein wenig verschoben wird, damit sie mittig zwischen 3. und 4. Diagramm platziert wird.

set ylabel " "

Im Diagramm 5 muss dann durch diese Zeile wieder die Bezeichnung für die y-Achse entfernt werden, damit sie nicht doppelt gezeichnet wird. Diagramm 6 beschränkt sich wieder wie Diagramm 3 auf Bezeichnung und Liniendarstellung der Daten.

### Graph 7: Niederschlag ###
set format x "%d.%m.%y"
set yrange [-20:30]
set ytics -15,5,25
set ylabel "Niederschlag [mm]nTemperatur [°C]" offset 0,0
set label 1 "Klimadaten" at graph 1.0, graph 0.5 rotate by 90 center offset 1,0
plot "Klima.dat" using 1:3 with boxes fs solid 1 noborder fc rgb "medium-blue" title "Tagesniederschlag",
     "Klima.dat" using 1:2 with lines ls 5 title "Tagesdurchschnittstemperatur"

Den Abschluss bildet das Diagramm 7 mit den Klimadaten. Hier soll nun die primäre x-Achse beschriftet werden (Zeile 2). Die y-Achse bekommt eine andere Skalierung als die restlichen Diagramme (Zeilen 3 und 4) sowie eine andere Bezeichnung (Zeile 5). Der Rest ist weiter oben bereits erklärt worden.

 

9. Abschluss der Plotdatei

unset multiplot
set output
set terminal x11

Den Abschluss der Datei bildet das Beenden des Multiplot-Modus (Zeile 1). Mit der Zeile 2 und 3 sorgt man dafür, dass eine andere Ausgabe aktiviert wird. Dies verhindert spätere Probleme mit dem EPS.

Hier die Dateien zum selber ausprobieren (ihr braucht nur eine der Dateien, der Inhalt ist der Gleiche):

multiplot.tar.gz
multiplot.zip

Diese Archive beinhalten folgende Dateien: multiplot.plt (die gnuplot-Plotdatei), Klima.dat (die Klimadaten) und Feuchtediff.dat (die Bodenfeuchtedaten)

Tipp:Um pfb-Dateien im Postscript-Terminal und auch die LaTeX-Schriftart verwenden zu können, benötigt man unter Ubuntu 11.10 die Pakete cm-super (dieses stellt die Schriftart zur Verfügung) und groff (dieses enthält das Werkzeug pfbtops, mit dem man pfb-Dateien PostScript-kompatibel transformieren kann). Sind diese installiert, kann man mit der o.g. fontfile-Option auch die LaTeX-Schriftart in das Diagramm einbinden.

 

Programm-Versionen, auf die sich dieser Artikel bezieht:

gnuplot: 4.4
Ubuntu: 11.10 (Oneiric Ocelot)

Multiplot-Diagramme in Gnuplot

7 Gedanken zu „Multiplot-Diagramme in Gnuplot

  1. Christian schreibt:

    Vielen herzlichen Dank für diesen Post! Als Neuling ggü. Gnuplot habe ich genau das gefunden, was ich gesucht habe!

    1. Gern geschehen. Freud mich, wenn ich weiterhelfen konnte. Ich musste mir damals als Neuling auch erst alles im Internet zusammensuchen, bis ich das Diagramm zusammen gefriemelt hatte.

  2. JR schreibt:

    Auch von mir vielen Dank für diese ausführliche Beschreibung. Sie hat mir sehr weiter geholfen.
    Mir ist bei meinem Plot allerdings aufgefallen, dass die innen-liegenden x-Achsen etwas dicker aussehen. Wenn mich nicht alles täuscht, ist das auch bei Dir der Fall (vielleicht ist es aber auch nur ein Darstellungsproblem).
    Ich habe mir damit beholfen, den Wert für Border auf 2+4+8 zu setzen und beim letzen plot auf 1+2+4+8.

    1. Danke für den Tipp. Das ist mir noch gar nicht aufgefallen. Das könnte allerdings auch eine optische Täuschung sein, da bei den äußeren Achsen die Teilstriche nur auf der inneren Seite angezeigt werden und bei den inneren Achsen auf beiden Seiten der Achse, sodass dadurch die Achse selbst dicker wirkt.

      Das muss ich mir mal in einer ruhigen Minute genauer anschauen …

  3. Vielen Dank für den tollen Artikel, bis jetzt habe ich Diagramme nur mit LibreOffice erstellt, bin aber schon öfter an dessen Grenzen gestoßen. Mal schaun, vielleicht kann ich mich jetzt in gnuplot einarbeiten.
    Ich fände es super spannend, wenn Du auch den Kontext zu den Daten beschrieben hättest, da es ja einige Unterschiede in den einzelnen Varianten gab. Leider sind die Varianten aber nicht erklärt.

    1. Bei den Varianten handelt es sich um verschiedene Intensitäten der Bodenbearbeitung, welche mit der Variante A verglichen werden. Dabei stellt die Variante A die betriebsübliche Bodenbearbeitungsmethode dar.

      1. Aha, Bodenbearbeitung. Danke! Dass Variante A die betriebsübliche Methode sein muss, war ja klar, nachdem immer die Unterschiede zu A gezeigt wurden. Ich bin Landwirt, und deshalb würde mich es genau interessieren: Worin bestand die Bodenbearbeitung in den verschiedenen Varianten? Wurde der Versuch weitergeführt? Mit welchem Ergebnis? Gibt es irgendwoanders was zu dem Versuch zu lesen?
        Vielen Dank!

Schreibe einen Kommentar zu LeWumpy Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert