Datenvisualisierung mit JpGraph

Auf einen Blick
Kommentare

Bei der Menge an Daten, die in manchen Arbeitsbereichen anfallen, kann ein Graph sehr hilfreich sein, um einen schnellen Eindruck der Situation zu vermitteln. Mit JpGraph existiert eine ausgezeichnete Klassenbibliothek zum Erstellen von Graphen in PHP. Dieser Artikel führt in die Erzeugung von Graphen am Beispiel eines Balkendiagramms, eines kombinierten Balken- und Liniendiagramms sowie eines Gantt-Charts ein.

Mit der zunehmenden Datenflut in der heutigen Informationsgesellschaft wird es besonders in vielen Bereichen des Arbeitslebens immer aufwändiger, die richtigen Daten zum richtigen Zeitpunkt zu erkennen. Mit der zur Verfügung stehenden Vielzahl an Datenbanken unterschiedlicher Preiskategorien und dem immer billiger werdenden Speicherplatz wird eine Vielzahl von Arbeits- und Prozessdaten protokolliert, um z.B eine spätere Rückverfolgung zu garantieren oder um Tendenzen festzuhalten. Ein grafischer Überblick über diese Daten ist in vielen Fällen hilfreicher als das reine Blättern in Tabellen: Ein Graph kann die tabellarische Darstellung nicht ersetzen, aber ausgezeichnet ergänzen. Ob es nun um die Entwicklung der Temperatur- und Druckverhältnisse in einer Presse während des Pressvorgangs, um die Menge der produzierten Einheiten pro Stunde an einem Fließband oder um die Anzahl und Art der verkauften Artikel pro Kalenderwoche geht, ein Blick auf den Graphen erlaubt eine schnelle Analyse der Situation. Etwaige Eigenheiten, Tendenzen oder Anomalien lassen sich am Graphen schnell feststellen und können anhand der tabellarischen Daten anschließend im Detail analysiert werden. Wer Webapplikationen in PHP schreibt, hat mit Hilfe der GD-Erweiterung die Möglichkeit, Grafiken dynamisch zu erzeugen. Die entsprechenden Funktionen sind gut dokumentiert und erlauben große Flexibilität beim Entwickeln. Wer allerdings Diagramme darstellen möchte, eventuell auch verschiedene Typen, muss einiges an Programmierarbeit leisten, um zu einem dynamisch skalierbaren, optisch ansprechenden und mathematisch korrekten Ergebnis zu kommen. JpGraph ist eine von Johan Persson entwickelte Klassenbibliothek, welche auf der GD-Erweiterung aufbaut und mit deren Hilfe komplexe und grafisch ansprechende Diagramme erstellt werden können. Dabei werden unter anderem Balken-, Torten-, Punkt- und Liniendiagramme ebenso unterstützt wie Scatterplots und Gantt-Charts; auch eine Kombination diverser Diagrammtypen in einem Graphen ist möglich, z.B. Balken- und Liniendiagramm. Auf Grund des objektorientierten Aufbaus von JpGraph reicht es, eine Instanz eines (Graphen-) Objekts anzulegen, deren gewünschte Eigenschaften zu setzen, ein oder mehrere Diagramme zu erzeugen und an den Graphen anzufügen und die nötigen Methoden aufzurufen, um einen Graphen zu schaffen.

Installation

JpGraph benötigt folgende Softwarepakete:

  • PHP ab 4.0.2 (es empfiehlt sich der Einsatz des jeweils letzten Release von PHP)
  • GD ab 1.8.x
  • PHP-kompatibler Webserver (z.B. Apache oder IIS)

PHP muss mit der GD-Erweiterung kompiliert werden. Ob die GD-Erweiterung in PHP aktiviert ist, kann man mit dem Aufruf von in einem kleinen Testskript und der anschließenden Suche nach der Zeichenfolge GD Support in der daraus resultierenden Seite feststellen. Das jeweils neueste JpGraph-Paket kann von [1] heruntergeladen (zum Zeitpunkt des Verfassens dieses Artikels handelt es sich um jpgraph1.7.tar.gz) und mit tar xvzf jpgraph1.7.tar.gz entpackt werden. Das daraus entstandene Verzeichnis jpgraph-1.7/ beinhaltet zwei Textdateien, welche Informationen zur Installation (README) und zur Lizenz (QPL.txt) enthalten, sowie das Unterverzeichnis src/, in welchem sich die Sourcen von JpGraph befinden. Das Hauptverzeichnis kann beliebig umbenannt und an eine passende Stelle im Filesystem verschoben werden; es ist nicht nötig, dass dieses Verzeichnis im DocumentRoot des Webservers liegt, also kann es z. B. nach /usr/local/jpgraph verschoben werden. Damit nicht bei jeder include-Anweisung der volle Pfad zu den Bibliotheken angegeben werden muss, empfiehlt es sich, den Include-Pfad von PHP entsprechend zu setzen. Dafür gibt es drei Möglichkeiten, welche je nach Benutzerberechtigung eingesetzt werden können. Wer die nötigen Schreibrechte besitzt, kann die Konfigurationsdatei php.ini editieren und die Option include_path entsprechend setzen, z. B.:

ini_set("include_path", ini_get("include_path").":/usr/local/jpgraph/src");

In der Datei jpgraph.php können alle Konfigurationsoptionen gesetzt werden, die das Verhalten von JpGraph beeinflussen. Diese Datei ist gut dokumentiert, weshalb im Folgenden nur einige wichtige Optionen beschrieben werden, die nach Bedarf gesetzt werden sollten. Aus Performancegründen kann es sinnvoll sein, mit JpGraph erstellte Graphen zu cachen, sodass ein Graph nicht bei jedem Aufruf neu generiert werden muss, sondern eventuell aus dem Cache geladen werden kann, was den Webserver stark entlastet. Wer lieber mit Cache arbeitet, setzt die Option USE_CACHE auf true, die Defaulteinstellung ist false. Die Option CACHE_DIR beinhaltet den vollen, absoluten Pfad des Verzeichnisses, in welchem gecachte Graphen gespeichert werden. Der Benutzer, unter welchem der Webserver und somit JpGraph läuft, muss Lese- und Schreibrechte für dieses Verzeichnis besitzen. Diese Option ist nur wirksam, wenn die vorher genannte Option USE_CACHE auf true gesetzt ist. Wer Version 1.xx von GD benutzt, muss die Option USE_LIBRARY_GD2 auf false setzen, wer GD 2.x einsetzt, setzt USE_LIBRARY_GD2 dementsprechend auf true.

SetScale("textlin");

$barplot = new BarPlot($data);
$graph->Add($barplot);

$graph->Stroke();

?>

Dieses Beispiel kann betrachtet werden, indem die Datei direkt im Browser aufgerufen wird oder indem sie als Bild in eine HTML-Seite eingebunden wird. Dies erfolgt wie bei einem gewöhnlichen Bild mittels eines Image-Tags, welches auf das Listing zeigt: Mit diesen wenigen Zeilen Code ist bereits ein Diagramm erzeugt worden. Was geschieht eigentlich genau in diesem Listing?

<img src="http://cdn.sandsmedia.com/ps/onlineartikel/pspic/picture_file//50/import3db3c19a86f69.tiff<
Abb. 1: Einfaches Balkendiagramm

Zur Textausgabe in Graphen stellt JpGraph drei interne Fonts zur Verfügung FF_FONT0, FF_FONT1 und FF_FONT2. Des Weiteren können die Stile FS_NORMAL, FS_BOLD (fett), FS_ITALIC (kursiv) und FS_BOLDIT (fett und kursiv) benutzt werden. Wer lieber einen anderen Font verwendet, kann TrueType-Fonts einsetzen, vorausgesetzt die Option TTF_DIR in jpgraph.php zeigt auf ein Verzeichnis, welches die entsprechenden Fontdateien enthält. Vordefinierte Fontfamilien sind FF_COURIER, FF_VERDANA, FF_TIMES, FF_HANDWRT, FF_COMIC, FF_ARIAL sowie FF_BOOK. Wer sich mutig fühlt und die standardmäßig definierten Fonts dieser Familien mit eigenen Fonts ersetzen möchte, kann dies im Konstruktor der Klasse TTF() bewirken. Nun soll ersichtlich sein, welche Wochentage durch die einzelnen Balken repräsentiert werden. Dazu wird ein neuer Array definiert, der die gleiche Anzahl an Elementen wie der Datenarray $data besitzt, und an die Methode SetTickLabels() der X-Achse übergeben:

$graph->img->SetMargin(40,40,40,60);

SetType(MARK_CIRCLE) hervorgehoben werden. Dadurch wird an den entsprechenden X/Y-Koordinaten ein nicht gefüllter Kreis eingezeichnet. Weitere gültige Parameter für diese Methode sind MARK_SQUARE (gefülltes Viereck), MARK_UTRIANGLE (nach oben zeigendes Dreieck), MARK_DTRIANGLE (nach unten zeigendes Dreieck), MARK_DIAMOND (Diamantenform). Mit der Methode SetCenter() wird das resultierende Diagramm zwecks erhöhten optischen Genusses ins Zentrum des Graphen gerückt. Dabei kümmert sich JpGraph selbst darum, das darunter liegende Balkendiagramm ebenfalls korrekt einzurücken. Wenn ein Linien- und ein Balkendiagramm zusammen dargestellt werden, wird das Liniendiagramm am linken Ende eines jeden Balkens ausgerichtet:

php_value include_path ".:/usr/share/pear/:/usr/local/jpgraph/src"

Es ist möglich, den einzelnen Balken des Diagramms mittels einer Imagemap diverse URLs zuzuweisen. Auf diese Weise kann z.B. von einem Balken direkt auf die entsprechende Seite mit den Tagesdaten in tabellarischer Form gelinkt werden. Des Weiteren können Bezeichnungen für den jeweiligen ALT-Tag eines Balkens angegeben werden. Solche Imagemaps sind für Balken-, Linien- und Tortendiagramme (2D und 3D) sowie für Scatter-Plots möglich. Im vorliegenden Beispiel soll nun eine Imagemap für die Balken und die Einzelwerte des Liniendiagramms angelegt werden. Dazu werden vier neue Arrays definiert: $btargets und $balts beinhalten die URLs der einzelnen Balken respektive deren Bezeichner, $ltargets und $lalts beinhalten die entsprechenden Daten des Liniendiagramms. Mit der Methode SetCSIMTargets() werden die nötigen Werte gesetzt, bevor das Balken- bzw. Liniendiagramm dem Graphen angefügt wird (vergl. Listing 1). Listing 1

<img src="http://cdn.sandsmedia.com/ps/onlineartikel/pspic/picture_file//50/import3db3c19a932a8.tiff<
Abb. 2: Graph mit Balken- und Liniendiagramm

Wer häufiger mit der Erstellung von Projekt- und Entwicklungsplänen zu tun hat, ist wahrscheinlich mit Gantt-Diagrammen – bzw. Gantt-Charts – vertraut. Henry Gantt, ein amerikanischer Industrieingenieur und Berater, erfand 1917 den nach ihm benannten Diagrammtyp, der zur Veranschaulichung zeitlicher Abläufe und ihrer einzelnen Teilabschnitte ebenso wie zur Visualisierung von Abhängigkeiten und Fortschritt der einzelnen Abschnitte dient. Mit Hilfe von Softwarepaketen wie MrProject, MS Project oder MS Visio können Gantt- Charts relativ komfortabel erzeugt werden. JpGraph bietet seit Version 1.5-BETA die Möglichkeit, Gantt-Charts zu erstellen. Im Folgenden soll dazu ein kleines Beispiel erstellt werden. Dazu muss zusätzlich zur Hauptbibliothek jpgraph.php die Bibliothek jpgraph_gantt.php eingebunden werden. Eine neue Instanz von GanttGraph() wird angelegt. Wer möchte, dass Breite und Höhe des auszugebenden Graphen automatisch berechnet werden, kann dem Konstruktor des Objekts jeweils den Wert 0 für die entsprechenden Parameter übergeben bzw. ihn auch gänzlich ohne Parameter aufrufen:

php_value include_path ".:/usr/share/pear/:/usr/local/jpgraph/src"

Anschließend werden in einer Schleife alle Elemente des Datenarrays durchlaufen und jeweils ein Balken mit den nötigen Parametern angelegt. Ein Balken erwartet folgende Parameter:

<img src="http://cdn.sandsmedia.com/ps/onlineartikel/pspic/picture_file//50/import3db3c19a9a7ea.tiff<
Abb. 3: Gantt-Chart

In den einzelnen Skripts, die die Graphen erzeugen, wird dann diese Wrapperklasse eingebunden. Instanzen des Graphenobjekts werden dann jeweils mit $graph = new JpGraph($breite, $hoehe); erzeugt. Beim späteren Einsatz von JpGraph 2.0 reicht das Entfernen der Wrapperklasse. Um allgemeine Verwirrung zu vermeiden, wird in den Beispielen in diesem Artikel allerdings die klassische Variante und somit die Graph()-Klasse verwendet.

Lizenz

Während frühere Versionen der GPL unterlagen, wird JpGraph ab Version 1.6 unter der QPL (Qt Public License) verteilt. Bei der QPL handelt es sich um eine anerkannte Open Source-Lizenz, die allerdings nicht mit der GPL kompatibel ist (siehe [3] unter The Q Public License (QPL), Version 1.0). Zwar dürfen der QPL unterliegende Softwarepakete unmodifiziert weitergegeben werden, wer allerdings Änderungen oder Erweiterungen an solch einem Paket macht, darf diese Änderungen nicht mit dem Paket selbst verteilen, sondern nur als gesonderte Patches zur Verfügung stellen. Dabei bleibt dem ursprünglichen Autor des Softwarepakets das nicht-exklusive und gebührenfreie Recht vorbehalten, Patches von anderen Entwicklern in die offizielle Version mit einfließen zu lassen. Es ist gestattet, eine unter der QPL lizenzierte Bibliothek in einem GPL-Programm aufzurufen und zu verwenden, allerdings nicht, ein QPL-Programm mit einem GPL-Programm zu verschmelzen (siehe obengenannte URL für Details). Nähere Informationen zu den verschiedenen Lizenzen finden sich unter [4] sowie unter [5]. Wer ein unter der QPL lizenziertes Paket gerne kommerziell einsetzen und zusammen mit seiner Eigenentwicklung vertreiben möchte, ohne seinen Kunden aber alle Sourcen seines Programms bereit stellen zu müssen, dem bleibt die Möglichkeit, den Autor und Copyrightinhaber des Paketes zu kontaktieren. Dieser kann bei Bedarf und nach eigenem Gutdünken eigens lizenzierte Versionen an Interessierte vergeben.

Fazit

Mit JpGraph existiert eine Software für PHP, welche es erlaubt, auf schnelle, einfache und optisch ansprechende Weise Graphen zu erzeugen und somit Daten zu visualisieren. Dabei besticht JpGraph vor allem durch die Vielfalt der möglichen Diagrammtypen und die Möglichkeit, mehrere, auch unterschiedliche Diagramme in einem Graphen darzustellen. Der Autor Johan Persson verbessert und erweitert JpGraph kontinuierlich; Interessierte können den Release-Plan mit Zeiten und Angaben zu den zu erwartenden neuen Features unter [6] einsehen. Die vollständigen und mit Kommentaren versehenen Sourcen zu den Beispielen finden sich auf der Heft-CD. Florian Lanthaler ist freiberuflicher Entwickler und Berater in Meran (Südtirol), mit den Schwerpunkten Web-basierte Applikationen sowie Datenbanken und arbeitet zur Zeit an einer zum Großteil Web-basierten Software zur Verwaltung und Visualisierung von Prozess-, Produktions- und Lagerdaten für einen Industriekonzern. Er setzt JpGraph unter anderem im Open-Source-Projekt phpaga ein [phpaga.net/].

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -