AA_PO-22909_MikePrice-123RF.jpg

© Mike Price, 123RF

Grafikbibliotheken in Python-Programmen

Punktgenau

Häufig gelingt es erst mit einer geeigneten Visualisierung, komplexe Daten und deren Zusammenhänge anschaulich zu machen. Dabei greifen Ihnen Python und mächtige Bibliotheken wie Matplotlib, Bokeh und Pandas hilfreich unter die Arme.

In allen Bereichen unseres Alltags gilt es, Daten zu erfasst, zu verarbeiten und in aufbereiteter Form wieder zugänglich zu machen. Dazu gehören etwa Wetterdaten – Temperatur, Niederschlag, Luftfeuchtigkeit, Luftdruck, Wind –, Umsatzzahlen, Lastmessungen sowie Zugriffs- und Nutzungszahlen von Fahrzeugen und Diensten.

Werten Sie die Daten nach der Erfassung aus, drängt sich als einfachste Form [1] der Darstellung eine Tabelle [2] auf. Sie hilft dabei, die einzelnen Werte zu überblicken [3]. Eine geeignete grafische Visualisierung erlaubt es darüber hinaus, die Zusammenhänge auf einen Blick zu verstehen. Für Python gibt es exzellente Bibliotheken, mit denen Sie diesen Schritt der Darstellung realisieren. Dazu zählen zum Beispiel Matplotlib [4], PyQtGraph [5], Bokeh [6] und Pandas [7]. Entsprechende Libraries für andere Programmiersprachen fasst der Kasten "Visualisierungsbibliotheken für andere Sprachen" zusammen.

Neben der Ausgabe der Daten als 2D- oder 3D-Abbildung enthält die jeweilige API zur Bibliothek Methoden zur Interaktion (PyQtGraph, Bokeh) sowie zur Analyse der Daten (Pandas). Mit einem kurz gehaltenen Beispielprogramm zeigen wir Ihnen jeweils, wie Sie dabei die Einstiegshürde überspringen.

Installation und Varianten

Matplotlib, PyQtGraph und Pandas richten Sie bei allen gängigen Distributionen bequem via Paketmanager aus den Repositories ein. Unter Debian und Ubuntu heißen die entsprechenden Pakete beispielsweise python-matplotlib, python-pyqtgraph und python-pandas. Bokeh jedoch liegt in vielen Distributionen nicht als Paket vor. Sie beziehen es am besten von der Webseite des Projekts und installieren es über Anaconda oder über Pip, das Paketverwaltungsprogramm für Python-Pakete aus dem Python Package Index (PyPI).

Die Listings in diesem Artikel basieren überwiegend auf Python 2.x, lassen sich aber mit nur geringen oder ohne Änderungen auf den Nachfolger Python 3.x anwenden. Letzterer kodiert beispielsweise alle Zeichenketten als Folge von Unicode-Zeichen, was das Verwenden von Umlauten und Sonderzeichen vereinfacht. Einen Einblick in die Unterschiede der beiden Versionen verschafft Ihnen Rainer Grimms Umstiegshilfe [30].

Visualisierungsbibliotheken für andere Sprachen

Stehen Sie mit der Programmiersprache Python eher auf dem Kriegsfuß, finden Sie möglicherweise bei anderen Sprachen die richtige Bibliothek. Für Perl stehen beispielsweise Plplot [16] sowie die Module Chart::Clicker [17] und GD::Graph [18] bereit. PHP bringt die GDLib [19] mit, lässt sich aber auch mit jpGraph [20] kombinieren. Auf Javascript basierende Anwendungen statten Sie mit dem InfoVis Toolkit [21], D3 [22] oder Crossfilter [23] aus. Für die Kombination aus Javascript und jQuery eignen sich jqPlot [24], Visualize [25] und Flot [26] als Kandidaten. Alternativ steht Ihnen auch die Statistiksprache R [27] zur Verfügung – sie bringt Funktionen zum Plotten von Daten gleich von Haus aus mit. Einen Überblick zu weiteren, ähnlichen Frameworks und Libraries bieten beispielsweise die Webseite Datavisualization.ch [28] und Brian Sudas Blogeintrag mit einer großen Übersicht zu Bibliotheken [29].

Matplotlib

Die ausgefeilte Bibliothek Matplotlib fokussiert ausschließlich darauf, Graphen, Histogramme, Leistungsspektren sowie Balken-, Torten- und Fehlerdiagramme im kartesischen Koordinatensystem im zwei- und dreidimensionalen Raum darzustellen. Ergänzende Toolkits wie Basemap [8] und Cartopy [9] stehen für weitere Projektionsarten und zur Kombination mit Kartendaten bereit.

Die Webseite zum Projekt liefert weitere Anregungen. Durchstöbern Sie etwa die Bildergalerie mit den Diagrammen, finden Sie dort zu jeder Darstellung den zugehörigen, teils recht umfangreichen Programmcode zur deren Erzeugung.

Matplotlib nutzen Sie in Python-Skripten, in der Python-Shell und auch im iPython-Notebook [10]. Daneben harmoniert die Bibliothek bestens mit webbasierten Applikationservern und Toolkits zum Erstellen grafischer Benutzeroberflächen.

Als erstes Beispiel wollen wir mit Matplotlib Temperaturen darstellen, die wir an 5 Tagen Frühsommer sowohl tagsüber als auch nachts gemessen haben. Die Tabelle "Temperaturen" führt die erfassten Daten auf, in Abbildung 1 sehen Sie den Python-Code im iPython-Notebook. Abbildung 2 zeigt das daraus erzeugte Diagramm.

Temperaturen

Tag Montag Dienstag Mittwoch Donnerstag Freitag
Temperatur (tagsüber) 22 23 19 24 15
Temperatur (nachts) 12 14 10 14 9
Abbildung 1: Der Python-Code zum Erzeugen des Diagramms im iPython-Notebook.
Abbildung 2: Das mithilfe von Matplotlib generierte Wetterdiagramm.

Werfen wir einmal einen genaueren Blick auf den Code aus Abbildung 1. Nach dem Import der beiden Bibliotheken numpy beziehungsweise matplotlib.pyplot unter den programmspezifischen Bezeichnern np und plt (Zeile 1 und 2) erfolgt zunächst die Definition des Diagramms.

Da 5 Messtage vorliegen, legt Zeile 4 die entsprechende Anzahl der Balken pro Tageszeit fest. In den Zeilen 5 und 6 erfolgt die Definition der Temperaturwerte für Tag und Nacht als Liste. In Zeile 7 definieren wir mit der Methode arange einen Bereich, der auf der Anzahl der Messtage basiert. Zeile 8 legt die Darstellung eines einzelnen Balkens auf 35 Prozent der Gesamtbreite fest.

Um das Diagramm mit den Balken bereits im Hintergrund vorzubereiten, erzeugt der Befehl in Zeile 9 die zwei Objekte fig und ax. Die Zeilen 10 und 11 legen die Darstellung der Balken fest, also deren Position auf der x-Achse, die Ausgabe der Temperaturen als y-Wert sowie die Breite und Farbe der Balken: Die Tageswerte erscheinen in Rot, die für die Nacht in Blau.

Die Zeilen 13 bis 16 ergänzen das Diagramm um die Achsenbeschriftung der y-Achse, den Titel, die Skaleneinteilung sowie die Beschriftung der x-Achse mit den Wochentagen. In Zeile 18 folgt die Legende für die beiden Balken, die später rechts oben im Diagramm in einer separaten Box erscheint. Zum Abschluss erfolgt der Aufruf plt.show(), der das Gesamtkunstwerk im Ausgabefenster darstellt (Abbildung 2).

Ein zweites Beispiel – den Code sehen Sie in Listing 1 – visualisiert die Partitionierung eines Speichermediums als Tortendiagramm. In Zeile 1 binden Sie zunächst wiederum die Grafikbibliothek matplotlib.pyplot unter dem lokalen Bezeichner plt ein. Danach legen Sie in den Zeilen 3 bis 6 für jedes Tortenstück dessen Bezeichnung (chartLabels), die Größe in Prozent, die Farbe sowie den Abstand fest, um den das Tortenstück vom Mittelpunkt wegrücken soll. Je größer der Zahlenwert, desto weiter vom Mittelpunkt entfernt erscheint das jeweilige Tortenstück.

Der Aufruf in Zeile 8 rendert das Tortendiagramm mitsamt eines Schattens. Die Methode aus Zeile 9 macht aus der ansonsten eher ovalen Darstellung einen gleichmäßigem Kreis. Abschließend rufen Sie wieder plt.show() auf, um das vorbereitete Tortendiagramm im Ausgabefenster darzustellen (Abbildung 3).

Listing 1

import matplotlib.pyplot as plt
chartLabels = '/', '/usr', '/home', '/var', '/tmp', '/opt'
chartSizes = [10, 15, 40, 10, 10, 15]
chartColors = ['yellow', 'green', 'blue', 'red', 'white', 'orange']
chartExplode = (0, 0, 0.2, 0, 0, 0)
plt.pie(chartSizes, explode=chartExplode, labels=chartLabels, colors=chartColors, autopct='%1.1f%%', shadow=True)
plt.axis('equal')
plt.show()
Abbildung 3: Hier stellt Matplotlib das Partitionierungsschema einer Festplatte als Tortendiagramm dar.

PyQtGraph

Bei PyQtGraph handelt es sich um ein vollständig in Python entwickeltes Paket, das sich betriebssystemübergreifend nutzen lässt. Neben einer grafischen Darstellung (Visualisierung) offeriert es auch eine Schnittstelle zur Applikations- und GUI-Entwicklung. Dazu dockt es über die beiden Frameworks PyQt [11] und PySide [12] an Qt an.

Inhaltlich bietet es eine Darstellung mit wissenschaftlichem Anspruch und entsprechend hoher Genauigkeit. Dazu ergänzt es quasi den Funktionsumfang von Matplotlib um die Möglichkeit, in der grafischen Ausgabe interaktiv per Maus Bereiche auszuwählen, zu vergrößern sowie entlang der Koordinatenachsen zu drehen und zu verschieben. PyQtGraph eignet sich daher zum Erstellen von Anwendungen, bei denen sich zur Laufzeit des Programms die Darstellung der Daten in der Ausgabe ändert oder der Benutzer eingreifen kann, beispielsweise bei Lastkurven, Video- und Filmausgaben sowie Animationen.

Das Beispiel aus Abbildung 4 zeigt eine Verlaufskurve in zwei Darstellungen nebeneinander. Der linke Part gibt einen Überblick (Wertebereich 0 bis 1000) mit zwei Markierungen bei 300 und 700 auf der x-Achse; der rechte Teil umfasst nur den Ausschnitt innerhalb dieser Markierungen.

Abbildung 4: Ein Diagramm mit einem interaktiv verschiebbaren, rechts separat dargestellten Ausschnitt.

Um den Ausschnitt zu verschieben, klicken Sie zunächst mit der linken Maustaste im linken Diagramm in den markierten Bereich. Dann halten Sie die Maustaste gedrückt und bewegen den Zeiger nach links oder rechts. Um dagegen die Grenzen des Ausschnitts zu verändern, klicken Sie die jeweilige Markierung mit der linken Maustaste an, halten diese gedrückt und verschieben dann die Ausschnittsgrenze. In beiden Fällen ändert sich die Darstellung im rechten Diagramm synchron. Über die rechte Maustaste erreichen Sie ein Kontextmenü zur Modifikation der Darstellung, etwa für das Raster des Koordinatensystems. Jedes Diagramm stellen Sie dabei separat ein (Abbildung 5).

Abbildung 5: Über ein Kontextmenü modifizieren Sie die Darstellung aus Abbildung 4 nach Lust und Laune.

Den zugrundeliegenden Programmcode finden Sie in Listing 2. Nach der Definition der benötigten Module (Zeilen 1 bis 3) initialisieren Sie in Zeile 5 die Qt-Applikation. In den Zeilen 7 bis 9 legen Sie ein Grafikfenster fest, das hier eine Größe von 700 x 200 Pixeln hat sowie über entsprechende Fenstertitel verfügt.

Ab Zeile 11 spezifizieren Sie die beiden Graphen. Zunächst aktivieren Sie zusätzlich eine Kantenglättung der dargestellten Kurven und legen den Bereich sowie die Datenpunkte fest. Die Variable p1 repräsentiert das linke Diagramm, p2 das Gegenstück rechts. Dabei legen die Zeilen 15 beziehungsweise 21 die zugehörigen Titel fest. In Zeile 16 geben Sie die Farbe zum Zeichnen der Datenpunkte als RGBA-Wert an. Die Kurve erscheint in Weiß mit einem Alpha-Wert von 200.

Den initialen Ausschnitt für die rechte Kurve definieren Sie in Zeile 17, die zugehörigen Funktionen zum Aktualisieren in den Zeilen 24 bis 28. Die Verknüpfung zwischen den beiden Diagrammen erzeugen Sie in den Zeilen 30 und 31, indem Sie die zuvor definierten Funktionen referenzieren. Die abschließenden Zeilen 34 bis 38 sorgen für den korrekten Aufruf der Qt-Applikation.

Listing 2

from pyqtgraph.Qt import QtGui, QtCore
import numpy as np
import pyqtgraph as pg
app = QtGui.QApplication([])
win = pg.GraphicsWindow(title="Ausschnitt bewegen")
win.resize(700,200)
win.setWindowTitle('Beispiel von pyqtgraph:Plotten mit Ausschnitt')
pg.setConfigOptions(antialias=True)
x = np.linspace(-100, 100, 1000)
data = np.sin(x) / x
p1 = win.addPlot(title="Bereichsauswahl")
p1.plot(data, pen=(255,255,255,200))
lr = pg.LinearRegionItem([300,700])
lr.setZValue(-10)
p1.addItem(lr)
p2 = win.addPlot(title="Spezifischer Bereich")
p2.plot(data)
def updatePlot():
   p2.setXRange(*lr.getRegion(), padding=0)
def updateRegion():
   lr.setRegion(p2.getViewBox().viewRange()[0])
lr.sigRegionChanged.connect(updatePlot)
p2.sigXRangeChanged.connect(updateRegion)
updatePlot()
## Start Qt event loop unless running in interactive mode or using pyside.
if __name__ == '__main__':
   import sys
   if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
       QtGui.QApplication.instance().exec_()

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 7 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

LinuxCommunity kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • 3D-Welten mit Python und Panda3D
    Es gibt zwar einige freie Spiele-Engines, doch nicht jede ist leicht zu programmieren. Panda3D vereinfacht durch die Skriptsprache Python den Einstieg, bietet aber auch Potenzial für Profis.
  • An einem Strang
    IPython Notebook bietet eine nahtlose Integration von Dokument, Programm und Werkzeugen. Damit erleichtert es das gemeinsame Arbeiten erheblich.
  • Durchgeschlängelt
    Mit Features überladene Tabellenkalkulationen gibt es zur Genüge. Dass eine ausgefeilte Spreadsheat-Anwendung auch einsteigertauglich sein kann, demonstriert das auf Python basierende Pyspread.
  • Augenfällig
    Die Plotutils versprechen schnelle Hilfe bei der Visualisierung nummerischer Daten in unterschiedlichsten Ausgabeformaten.
  • Entwicklungshelfer
    Nachdem in den ersten Teilen der Python-Einführung die Sprache beschrieben wurde, geht es im letzten Teil um nützliche Hilfen rund um Python.
Kommentare

Infos zur Publikation

LU 12/2017: Perfekte Videos

Digitale Ausgabe: Preis € 5,95
(inkl. 19% MwSt.)

LinuxUser erscheint monatlich und kostet 5,95 Euro (mit DVD 8,50 Euro). Weitere Infos zum Heft finden Sie auf der Homepage.

Das Jahresabo kostet ab 86,70 Euro. Details dazu finden Sie im Computec-Shop. Im Probeabo erhalten Sie zudem drei Ausgaben zum reduzierten Preis.

Bei Google Play finden Sie digitale Ausgaben für Tablet & Smartphone.

HINWEIS ZU PAYPAL: Die Zahlung ist ohne eigenes Paypal-Konto ganz einfach per Kreditkarte oder Lastschrift möglich!

Stellenmarkt

Aktuelle Fragen

Installation Linux mint auf stick
Reiner Schulz, 10.12.2017 17:34, 0 Antworten
Hallo, ich hab ein ISO-image mit Linux Mint auf einem Stick untergebracht Jetzt kann ich auch...
Canon Maxify 2750 oder ähnlicher Drucker
Hannes Richert, 05.12.2017 20:14, 4 Antworten
Hallo, leider hat Canon mich weiterverwiesen, weil sie Linux nicht supporten.. deshalb hier die...
Ubuntu Server
Steffen Seidler, 05.12.2017 12:10, 1 Antworten
Hallo! Hat jemand eine gute Anleitung für mich, wie ich Ubuntu Server einrichte? Habe bisher...
Tinte sparen bei neuem Drucker
Lars Schmitt, 30.11.2017 17:43, 2 Antworten
Hi Leute, ich habe mir Anfang diesen Monats einen Tintenstrahldrucker angeschafft, der auch su...
Für Linux programmieren
Alexander Kramer, 25.11.2017 08:47, 3 Antworten
Ich habe einen Zufallsgenerator entworfen und bereits in c++ programmiert. Ich möchte den Zufalls...