image image


image

Worknote: Gnuplot und Daten

Wie in der vorherigen Worknote versprochen, möchte ich Euch heute zeigen, wie einfach man aus vorhandenen Datensätzen mit Gnuplot Graphen zur Visualisierung dieser Daten erstellen kann. Als Datengrundlage für solch ein Tutorial bieten sich immer Wahldaten an – da man an sie in der Regel einfach herankommt –, und so habe ich mir aus der Wikipedia die Daten für die Berliner Abgeordnetenhauswahlen von 1990 bis 2011 ausgeborgt und in eine kleine Textdatei gepackt, die ich berlinwahlen.txt genannt habe:

# Wahlergebnisse zum Abgeordnetenhaus Berlin ab 1990
# Jahr	SPD 	CDU 	Grüne	Linke	Piraten	NPD 	FDP 	Graue	REP
1990	30.4	40.4	9.4 	9.2 	NaN 	NaN 	7.1 	NaN 	3.1
1995	23.6	37.4	13.2	14.6	NaN 	NaN 	2.5 	1.7 	2.7
1999	22.4	40.8	9.9 	17.7	NaN 	NaN 	2.2 	1.1 	2.7
2001	29.7	23.7	9.1 	22.6	NaN 	NaN 	9.9 	1.4 	1.3
2006	30.8	21.3	13.1	16.3	NaN 	2.6 	7.6 	3.8 	NaN
2011	28.3	23.4	17.6	11.7	8.9 	2.1 	1.8 	NaN 	NaN

Gnuplot erwarten die Werte spaltenweise, per Default ist ein Whitespace beliebiger Länge der Trenner zwischen den Spalten. Zeilen, die mit einem # beginnen, werden von Gnuplot als Kommentare ignoriert.

Daten sind nicht immer, sondern eher selten sauber. So sind nicht alle Parteien zu jeder Wahl angetreten. Da Gnuplot nun einmal Leerzeichen als Spaltentrenner interpretiert, kann man diese Zellen nicht einfach leer lassen. Ich habe mit dem Befehl

set datafile missing "NaN"

Gnuplot einfach die Zeichenfolge NaN (Not a Number) als Indikator für leere Werte mitgeteilt.

Aufgrund vorzogener Neuwahlen und dem Wechsel von einer vierjährigen auf eine fünfjährige Amtsperiode fanden die Wahlen nicht in regelmäßigen Abständen statt. Darum habe ich einmal mit

set xrange [1990:2011]

die Werte der x-Achse explizit gesetzt und zum anderen beim ersten Plotbefehl mit

plot "berlinwahlen.txt" using 1:2:xtic(1) t "SPD" lc rgb "#ff0000", …

dem Programm auch noch mitgeteilt, daß es sich die Ticks der x-Achse aus der ersten Spalte der Datei holen soll.

Diese Zeile ist das Herzstück des Plots und verrät den Aufbau des gesamten Charts. Als erstes wird der Name der Datei angegeben, aus der Gnuplot seine Daten holen soll, dann die Spalten, aus denen die Daten gelesen werden sollen, dann mit t deutlich gemacht, daß ich eine timeline zeichnen möchte, als nächstes den String für das Label geschrieben und schließlich mit lc rgb "#ff0000" die Farbe eingestellt, mit der diese Linie gezeichnet werden soll (das Kommande lc ist die Kurzform für linecolor).

Gnuplot vermeidet, wenn es geht, Redundancen, daher muß man für die weiteren Werte nicht mehr den Namen der Datei angeben, der leere String ("") reicht.

Wie geht Gnuplot nun mit den leeren Werten in unserer Datei um? Im Prinzip gibt es zwei Möglichkeiten. Ist der Wert zum Beispiel mit using 1:8 festgelegt, wird zwischen fehlenden Werten einfach interpoliert, daß heißt in diesem Falle, eine gerade Linie gezeichnet. Das ist aber bei Wahldiagrammen in der Regel nicht das, was man will. Mit using 1:($8) erreicht man daher, daß die fehlenden Werte einfach nicht gezeichnet werden, also eine Lücke im Diagramm gelassen wird.

Das ganze Progrämmchen sieht im Endeffekt so aus:

set term svg
set output "berlinwahlen.svg"

set encoding utf8
set datafile missing "NaN"

set title "Abgeordnetenhauswahlen in Berlin (1990 - 2011)"
set style data lines
set xrange [1990:2011]
set grid

plot "berlinwahlen.txt" using 1:2:xtic(1) t "SPD" lc rgb "#ff0000",
"" using 1:3 t "CDU" lc rgb "#000000", "" using 1:4 t "Grüne" lc rgb "#138313",
"" using 1:5 t "Linke" lc rgb "#ad3b98", "" using 1:($6) t "Piraten" lc rgb "#3b72ad",
"" using 1:($7) t "NPD" lc rgb "#7e533a", "" using 1:($8) t "FDP" lc rgb "#f3db28",
"" using 1:($9) t "Graue" lc rgb "#888888", "" using 1:($10) t "REP" lc rgb "#282bf3"

Aus Gründen der Lesbarkeit mußte ich die letzte Zeile, die mit plot beginnt, wieder umbrechen. Im eigentlichen Skript gehört das natürlich alles in eine einzige Zeile.

image

Diese Graphik ist das Ergebnis meiner Bemühungen. Ich hatte als Terminal wieder svg gewählt und so wie beim letzten Mal eine SVG-Datei erhalten, die ich umstandslos in diese Seite einbinden konnte.

Es ist in meinen Augen schon erstaunlich, wie Gnuplot mit wenigen Zeilen Code eine publikationsfähige Graphik herbeizaubert. Und die Liste der Optionen, mit der man solche Graphiken verschönern kann, ist riesig. Ich werde mich vielleicht in einem späteren Beitrag damit beschäftigen. Still digging!

image


2 (Email-) Kommentare


In Datenbanken und Textdateien, die aus Datenbanken exportiert wurden liegen die Daten oft in normalisierter Form vor. Dieselben Wahlergebnisse sehen also wie folgt aus:
Jahr Anteil Partei
1990 30.4 SPD
1995 23.6 SPD
1999 22.4 SPD
2001 29.7 SPD
2006 30.8 SPD
2011 28.3 SPD
1990 40.4 CDU
1995 37.4 CDU
1999 40.8 CDU
2001 23.7 CDU
2006 21.3 CDU
2011 23.4 CDU
1990 9.4 Grüne
1995 13.2 Grüne
1999 9.9 Grüne
2001 9.1 Grüne
2006 13.1 Grüne
2011 17.6 Grüne
1990 9.2 Linke
1995 14.6 Linke
1999 17.7 Linke
2001 22.6 Linke
2006 16.3 Linke
2011 11.7 Linke
2011 8.9 Piraten
2006 2.6 NPD
2011 2.1 NPD
1990 7.1 FDP
1995 2.5 FDP
1999 2.2 FDP
2001 9.9 FDP
2006 7.6 FDP
2011 1.8 FDP
1995 1.7 Graue
1999 1.1 Graue
2001 1.4 Graue
2006 3.8 Graue
1990 3.1 REP
1995 2.7 REP
1999 2.7 REP
2001 1.3 REP
Kann Gnuplot daraus die gleiche Grafik erstellen?

– Andreas S. (Kommentieren) (#)


Die Grafik hat leider ein Problem: die Piraten fehlen oder sind zumindest nicht zu erkennen, da sie erst 2011 angetreten sind, also am rechten Rand der Grafik, und daher kein Strich möglich ist. Liegt natürlich nicht an Gnuplot, die verwendete Darstellungsweise ist einfach für diesen Fall ungeeignet, da sie Entwicklungen zeigt.

– Roland B. (Kommentieren) (#)


(Kommentieren)  Gnuplot und Daten – 20160330 bitte flattrn

image image



Über …

Der Schockwellenreiter ist seit dem 24. April 2000 das Weblog digitale Kritzelheft von Jörg Kantel (Neuköllner, EDV-Leiter, Autor, Netzaktivist und Hundesportler — Reihenfolge rein zufällig). Hier steht, was mir gefällt. Wem es nicht gefällt, der braucht ja nicht mitzulesen. Wer aber mitliest, ist herzlich willkommen und eingeladen, mitzudiskutieren!

Alle eigenen Inhalte des Schockwellenreiters stehen unter einer Creative-Commons-Lizenz, jedoch können fremde Inhalte (speziell Videos, Photos und sonstige Bilder) unter einer anderen Lizenz stehen.

Der Besuch dieser Webseite wird aktuell von der Piwik Webanalyse erfaßt. Hier können Sie der Erfassung widersprechen.

Diese Seite verwendet keine Cookies. Warum auch? Was allerdings die iframes von Amazon, YouTube und Co. machen, entzieht sich meiner Kenntnis.


Werbung


Werbung


image  image  image
image  image  image