© Bart Vastenhouw/Shutterstock.com
Mit JavaPlot Diagramme oder Grafiken erstellen

Matlabs kostenloses Gegenstück für Java


JavaPlot ist eine Bibliothek, die es ermöglicht, auf das umfangreiche Tool Gnuplot zuzugreifen. Dabei stellt JavaPlot geeignete Schnittstellen sowie Klassen zur Verfügung, um die Erstellung von Diagrammen mittels Gnuplot von einem Java-Programm aus zu ermöglichen.

Beim Plotten vertraut JavaPlot auf das Hilfsprogramm Gnuplot, das auf mehreren Plattformen läuft. Das kostenlose Programm ist vor allem bei Studenten und Wissenschaftlern beliebt, lassen sich doch damit Funktionen oder Daten plotten. Gnuplot kann sowohl 2D- als auch 3D-Grafiken generieren.

Ehe ihr JavaPlot in eurem Java-Programm einsetzen könnt, braucht ihr Gnuplot [1]. Aktuell ist JavaPlot in der Version 0.5.0 verfügbar [2]. Leider ist es nicht mehr auf dem neuesten Stand, zuletzt wurde es 2015 überarbeitet. Um die Diagramme bestmöglich aussehen zu lassen, schadet es nicht, sich im Vorfeld ein wenig mit dem JavaPlot-Paket zu beschäftigen:

Ort

Datei

Funktion

~/com/panayotis/gnuplot/style/

Fill.java

Füllart

~/com/panayotis/gnuplot/style/

NamedPlotColor.java

Farbkonstanten

~/com/panayotis/gnuplot/style/

Smooth.java

Funktionen bzw. Kurven glätten

~/com/panayotis/gnuplot/style/

Style.java

Formen

~/com/panayotis/gnuplot/dataset/

FileDataSet.java

Datendatei einlesen

~/com/panayotis/gnuplot/plot/

DataSetPlot.java

Datenreihen plotten

~/com/panayotis/gnuplot/plot/

AbstractPlot.java

stellt Funktionen zur Verfügung, um auf die PlotStyle-, FillStyle- sowie Smooth-Klasse zuzugreifen

~/com/panayotis/gnuplot/plot/

Axis.java

Eigenschaften der Achsen

~/com/panayotis/gnuplot/style/

FillStyle.java

das Füllen von Formen festlegen

~/com/panayotis/gnuplot/style/

PlotStyle.java

Farbe der Linien oder Formen festlegen, Linienbreite oder Punktgröße bestimmen

~/com/panayotis/gnuplot/style/

JavaPlot.java

beinhaltet Gnuplots Plot-Befehl

~/JavaPlot-0.5.0/dist/

JavaPlot.jar

JAR Library

~/JavaPlot-0.5.0/dist/javadoc/

Javadoc-generierte Dokumentation

~/JavaPlot-0.5.0/demo/

Beispieldateien

Tabelle 1: JavaPlot-Paket

Auch Gnuplot stellt auf der Homepage eigens eine Dokumentation zur Verfügung. Außerdem existieren auf der Gnuplot-Webseite Demos, in denen ihr nachschlagen könnt, wie sich das gewünschte Diagramm zeichnen lässt [3]. Alle in diesem Artikel gezeigten Diagramme basieren auf Gnuplot 5.4.

Was JavaPlot nicht kann

Für 3D-Grafiken verwendet Gnuplot üblicherweise den Befehl splot. Den gibt es auch unter JavaPlot, indem beim Erzeugen einer Instanz vom Typ JavaPlot wie folgt vorgegangen wird:

JavaPlot p = new JavaPlot(true);

Den splot-Befehl braucht ihr beispielsweise bei der Helix (Abb. 1), den JavaPlot jedoch nicht wie eine Helix zeichnet. In Listing 1 steht der Code, der für Abbildung 2 verantwortlich ist.

Listing 1

import com.panayotis.gnuplot.JavaPlot; import com.panayotis.gnuplot.terminal.PostscriptTerminal; public void paintHelix() { JavaPlot p = new JavaPlot(true); PostscriptTerminal epsf = new PostscriptTerminal(System.getProperty("user.home") + System.getProperty("file.separator") + "diagram.eps"); epsf.setColor(true); p.setTerminal(epsf); String func = "[t=0:3*pi] cos(t),sin(t),t"; p.addPlot(func); p.setTitle("3D Spiral"); p.setKey(JavaPlot.Key.BELOW); p.plot(); System.out.println("Commands: "+p.getCommands()); }

Mit der Klasse PostscriptTerminal lässt sich die erstellte Grafik im EPS-Dateiformat abspeichern. Ihr könnt die Datei zum Beispiel mit Inkscape öffnen und in ein anderes Format exportieren. Funktionen werden üblicherweise als String an die Methode javaplot.addPlot übergeben. Den Wertebereich der einzelnen Achsen könnt ihr auch als String beim Plot-Befehl angeben. Allerdings existieren hierfür von JavaPlot zur Verfügung gestellte Funktionen (mehr dazu später). Die Methode javaplot.setTitle legt den Titel des Diagramms fest. Der Ort der Legende lässt sich mittels javaplot.setKey angeben. Falls das Ergebnis nicht wie erwartet ausfällt, könnt ihr die Methode javaplot.getCommands verwenden, um die Gnuplot-Befehle auszugeben. Dadurch wisst ihr, welche Gnuplot-Befehle sowie Optionen JavaPlot verwendet, um die Grafik zu erzeugen.

minosi_javaplot_1.tif_fmt1.jpgAbb. 1: Die Funktion sin(x):cos(x) ähnelt in 3D einer Spirale
minosi_javaplot_2.tif_fmt1.jpgAbb. 2: JavaPlot zeichnet zwar ein 3D-Grid, allerdings fehlt von der Spirale jede Spur

Weitere Beispiele, die JavaPlot nicht zeichnen kann, sind Höhenliniendiagramme, Farbtabellen sowie Heatmaps. Denn auch für diese Diagramme verwendet Gnuplot den splot-Befehl, sodass das Ergebnis unter JavaPlot nicht wie erwartet ausfällt. Aus diesem Grund wird sich in diesem Tutorial alles um 2D-Diagramme drehen.

Kuchendiagramme

Für Kuchendiagramme besitzt JavaPlot keine vordefinierte Form. Allerdings lässt sich mittels Stringbefehlen, die direkt an Gnuplot weitergereicht werden, ein Kreis samt Kreissegmenten zeichnen [4]. Speziell bei Gnuplot kann es vorkommen, dass mehrere Versuche benötigt werden, bis das gewünschte Ergebnis erzielt wird. Leider konnte trotz mehrmaliger Versuche nicht herausgefunden werden, wie sich das Grid unter JavaPlot deaktivieren lässt. Zwar reicht bei Gnuplot der Befehl unset grid oder unset tics aus, doch solche Befehle fehlen unter JavaPlot gänzlich.

Listing 2

import com.panayotis.gnuplot.JavaPlot; import com.panayotis.gnuplot.terminal.PostscriptTerminal; public void paintPieChart() { JavaPlot p = new JavaPlot(); PostscriptTerminal epsf = new PostscriptTerminal(System.getProperty("user.home") + System.getProperty("file.separator") + "diagram.eps"); epsf.setColor(true); p.setTerminal(epsf); String func = "x"; p.set("object 1 circle","arc[0:284] fc rgb \"brown\" at screen 0.5,0.5 size screen 0.45 front fillstyle solid 1.0"); p.set("object 2 circle","arc[284:316] fc rgb \"royalblue\" at screen 0.5,0.5 size screen 0.45 front fillstyle solid 1.0"); p.set("object 3 circle","arc[316:334] fc rgb \"#A17D52\" at screen 0.5,0.5 size screen 0.45 front fillstyle solid 1.0"); p.set("object 4 circle","arc[334:352] fc rgb \"goldenrod\" at screen 0.5,0.5 size screen 0.45 front fillstyle solid 1.0"); p.set("object 5 circle","arc[352:360] fc rgb \"forest-green\" at screen 0.5,0.5 size screen 0.45 front fillstyle solid 1.0"); p.setTitle("Percentage of Eye Colors"); p.setKey(JavaPlot.Key.BELOW); p.addPlot(func); p.plot(); }

Die Methode javaplot.set reicht die Stringbefehle direkt an Gnuplot weiter, sodass sich damit der Kreis doch noch zeichnen lässt. Bei JavaPlot muss jedoch vor dem Erstellen einer Grafik der implementierte Plot-Befehl javaplot.plot ausgeführt werden. Die plot-Methode von JavaPlot erwartet jedoch eine Funktion. Da die Funktion des Kreises zu komplex wäre, übergebt ihr der plot-Methode einfach die x-Funktion. Normalerweise würde der Befehl plot 'x' eine Gerade ausgeben, die die X-Werte gegen Y-Werte zeichnet. Allerdings überdeckt der Kreis die Funktion. Außerdem wird der Kreis für das Kuchendiagramm sowohl oben als auch unten abgeschnitten (Abb. 3). Der Rest des Codes ähnelt Listing 2.

minosi_javaplot_3.tif_fmt1.jpgAbb. 3: JavaPlot schneidet den unteren und oberen Teil des Kreises we...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Gewinner-Teams

Wir bieten Lizenz-Lösungen für Teams jeder Größe: Finden Sie heraus, welche Lösung am besten zu Ihnen passt.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang