4Max/shutterstock.com

20. Januar 2015 / von Robert Lauer

Schnell

mal was

visualisieren

Du musst schnell ein paar Daten visualisieren? Vielleicht auch noch automatisiert, als Teil des Buildprozesses?

Nun, die Python-Bibliothek matplotlib soll ja recht effektiv sein. Kann man mit 10 Zeilen oder weniger eine Statistik erstellen und in einem Bild speichern?

Was wir brauchen

Zuerst brauchen wir eine aktuelle Python3-Distribution, am besten eine, wo matplotlib und die ganzen darin integrierten Bibliotheken schon optimal aufeinander abgestimmt sind (und auf die im matplotlib-Projekt vorliegenden Beispiele). Ich habe mal eine aktuelle Winpython-Distro probiert (3.4.2.3), die sich mit ein paar Klicks unter Windows installieren lässt. Für Linux und MacOS finden sich natürlich ebenfalls mehrere Distributionen.

Als IDE bietet sich Jetbrains‘ PyCharm an — Python-Distributionen bringen zwar meist schon eigene Editoren mit, aber dort darf man dann auch jedes Refactoring von Hand machen. Und dafür, dass Python keine statisch typisierte Sprache ist, erkennt PyCharm doch erstaunlich viele Typfehler! Außerdem ist die Basisversion kostenlos, und selbst die professionelle Variante (mit den ganzen Webentwicklungsfeatures) kostet einen Bruchteil von modernen CASE-Tools (bei einem Vielfachen an Produktivitätsgewinn).

Was benötigen wir noch? Daten wären gut, wenn wir etwas visualisieren wollen, oder?

Fachliches Beispiel

Wir halten zunächst Ausschau nach irgendeinem fachlichen Problem, nicht zu komplex, bei dem wir etwas zu visualisieren haben. Nehmen wir ein Thema, an das sich für gewöhnlich nicht so viele Europäer herantrauen: die chinesische Sprache!

Warum lernen so wenige Europäer Chinesisch, wo es doch weltweit von mehr Menschen gesprochen wird als Englisch? Vielleicht ist das ein psychologisches Problem: Die chinesische Sprache tickt nun mal vollkommen anders als europäische Sprachen: Die vielen Schriftzeichen, Grammatik, Idiomatik, Aussprache – konzentrieren wir uns mal nur auf einen Aspekt, die Aussprache, und dabei wiederum auf einen Unteraspekt, der alle Anfänger am stärksten irritiert: Töne.

Chinesisch kennt fünf Töne – manchmal lest ihr vielleicht etwas von vier Tönen, weil der fünfte (neutrale) Ton gerne unter den Tisch fallen gelassen wird. Der Ton bestimmt – grob gesprochen – die Tonhöhe bzw. Tonhöhenveränderung eines Lauts. Ein und derselbe Laut kann je nach Ton völlig unterschiedliche Bedeutungen haben. Wenn man nun als Chinesischlerner Schriftzeichen und zusammengesetzte Phrasen lernt, fragt man sich natürlich: Wie häufig kommt eigentlich welcher Ton in der Sprache vor? Kommt einer vielleicht in 90% aller Fälle vor, sodass ich mir nur die Ausnahmen merken muss?

Diese Frage lässt sich leicht beantworten. Wir brauchen dazu:

  • eine Liste, wo alle Schriftzeichen aufgeführt sind. Ich habe mal HanDeDict benutzt, ein freies Deutsch-Chinesisch-Lexikon, das sich an das englische Pendant HanDict anlehnt und auch dessen Dateiformat zum Austausch von Lexikaeinträgen verwendet. Das Format ist krude, aber auch sehr einfach und deshalb für einen schnellen Prototypen ideal. Die Aussprache wird durch die romanisierte Pinyin-Schreibweise angegeben. Dabei wird der Ton praktischerweise nicht als Akzent angegeben (z.B. „má“=ma mit zweitem Ton (steigend)), sondern das Pinyin wird ohne Akzente und mit einer angehängten Ziffer bereitgestellt, welche den Ton darstellt (z.B. „ma2“).
  • matplotlib zum Erzeugen einer statistischen Graphik
  • ein paar Zeilen Python, um das Ganze zusammenzubringen

Code

Mein Beispielskript besteht aus zwei Teilen, von denen ich nur den Visualisierungsteil aufliste (wer möchte kann sich gerne das komplette Beispiel herunterladen):

    1. Aus der HanDeDict die aus genau einem Schriftzeichen bestehenden Einträge extrahieren. Das ist eine krude Heuristik, um alle (beliebig unwahrscheinlichen) Phrasen und zusammengesetzten Wörter herauszusieben. Sauberer wäre es natürlich, eine Liste zu verwenden, die die Zeichen, ihre Wahrscheinlichkeit und ihren Ton direkt liefert (z.B. die Liste von Jun Da).
    2. Die eigentliche Visualisierung sind dann nur noch 10 Zeilen:

visualisierung-code

Anmerkungen dazu:

  • plt referenziert in diesem Skript das pyplot-Modul, das wichtigste Zeichenmodul von matplotlib. Seine Verwendung ist wohl von Matlab inspiriert.
  • In der Variablen tones finden sich die fünf Töne: Das ist einfach eine Liste mit den Zahlen 1, 2, 3, 4, 5.
  • Der Ton gibt auch das Offset auf der X-Achse des Diagramms an — plus ein kleines Offset (left_indent), da wir ein Balkendiagramm zeichnen wollen, und mit der Methode bar (für das eigentliche Balkenzeichnen) geben wir die X-Koordinate in der Mitte des jeweiligen Balkens an, nicht die Koordinate des linken Rands.
  • In einer Schleife wird an jeden Balken noch die Häufigkeit annotiert (mit der Methode annotate). Dabei platziere ich den annotierten Text aus ästhetischen Gründen nicht ganz oben am Balken, sondern bei 9/10 (deshalb der Faktor 0.9).
  • Die *ticks-Methoden (xticks, yticks) bestimmen die Markierungsstriche an der X- bzw. Y-Achse.
  • savefig speichert das PNG, mit close wird der pyplot-Kontext aufgeräumt (wichtig, wenn man im Batch mehrere Bilder nacheinander erzeugen möchte). Statt savefig kann ich auch die Methode show aufrufen, um mir das Ergebnis interaktiv anzusehen.

Und so sieht das Ganze dann aus:
handedict_toene_haeufigkeit

Ausblick

Die matplotlib bietet viel mehr Funktionalität, als hier skizziert wurde. Die API ist sehr mächtig, aber auch kompliziert, und nicht immer intuitiv. Andererseits finden sich im Netz auch jede Menge Beispiele, woraus man sich die Features herauspicken kann, die man für sein Problem braucht.

Im Projektkontext konnte ich matplotlib auch schon erfolgreich für die Visualisierung von Loganalysen einsetzen. Auch dort habe ich nur einen Bruchteil der Möglichkeiten genutzt. Wer mehr wissen will sollte sich mal die Beispiele auf matplotlibs Homepage ansehen.

In Zukunft wäre es schön, wenn wir für gängige matplotlib-Anwendungsfälle eine Wrapperbibliothek hätten, die den 60%-Fall abdeckt und dafür einfach und schnell einsetzbar ist.

Autor

Robert Lauer
Robert Lauer
Weitere Artikel

Das könnte Sie auch interessieren