# In JFreeChart Geraden erzeugen



## mukipi (5. Mai 2015)

Hallo liebe Community:meld:

ich schreibe gerade an einer Arbeit in der ich einen geometrischen Algorithmus implementieren und visualisieren soll. Dabei muss ich Punkte in ein Koordinatensystem eintragen können und mit diesen Punkten verschiedene Geraden erzeugen und vergleichen/analysieren. Auch Schnittpunkte zu kennen wäre hilfreich.

Nachdem ich erst ein bisschen mit JXGraph herumexperimentiert habe, bin ich jetzt bei JFreeChart angelangt. Mit JFreeChart kann ich wunderbar Punkte in ein Koordinatensystem eintragen, aber mir gelingt es nicht Geraden zu erzeugen. Punkte mit Linien oder Splines zu verbinden ist nicht das Problem, ich möchte nur zu einem bestimmten Punkt eine Gerade erzeugen.

Kann man sowas mit JFreeChart machen? Und wenn ja wie? Gibt es einen passenden Renderer oder Ähnliches?

Oder würdet ihr eine ganz andere Bibliothek empfehlen, die ich noch nicht auf dem Schirm hatte?:bahnhof:
Bei JXGraph stand ich vor dem Problem zwar Geraden erzeugen zu können, dafür aber keine Punkte mehr...

Ich freue mich über jede Hilfe 

LG, mukipi


----------



## Harry Kane (5. Mai 2015)

mukipi hat gesagt.:


> Punkte mit Linien oder Splines zu verbinden ist nicht das Problem, ich möchte nur zu einem bestimmten Punkt eine Gerade erzeugen.


Versteh ich nicht. Eine Gerade ist mathematisch durch 2 Punkte definiert, Wie willst du "zu einem Punkt eine gerade erzeugen"?


----------



## mukipi (5. Mai 2015)

Oh Entschuldigung, da habe ich mich unklar ausgedrückt
Ich habe natürlich eine Funktion, in diesem Fall y = 2ax-b, die mir zu jedem Punkt eine Gerade berechnet. Wird mein Problem dadurch klarer?


----------



## Tom299 (6. Mai 2015)

Hast du dir mal JavaFX angeschaut? Vielleicht bringt dich das weiter:
https://docs.oracle.com/javafx/2/charts/line-chart.htm

Ich hab vor Jahren mal JFreeChart benutzt, aber habe nur CandleStick-Charts verwendet (Börsenprogramm). Vielleicht bietet JavaFX hier ja bessere Möglichkeiten. Hab da mit Charts aber noch null Erfahrung, was sich aber in Zukunft noch ändern wird ;-)


----------



## Harry Kane (6. Mai 2015)

mukipi hat gesagt.:


> Ich habe natürlich eine Funktion, in diesem Fall y = 2ax-b, die mir zu jedem Punkt eine Gerade berechnet. Wird mein Problem dadurch klarer?


Schon, obwohl du dich wieder sehr unglücklich ausgedrückt hast.
Eine Funktion berechnet dir nicht zu jedem Punkt eine Gerade, sondern zu jedem x-Wert einen y-Wert, die dann beide zusammen einen Punkt ergeben.
Du kannst dir z. B. eine XYAnnotation schreiben. XYAnnotation ist ein interface, welches von Objekten, die du auf einen XYPlot zeichnen willst, implementiert werden kann.
Dazu musst du die Methode 

```
draw(java.awt.Graphics2D g2, XYPlot plot, java.awt.geom.Rectangle2D dataArea, ValueAxis domainAxis, ValueAxis rangeAxis, int rendererIndex, PlotRenderingInfo info)
```
implementieren.
Dann kannst du dir über domainAxis.getLowerBound() und domainAxis.getUpperBound() die untere und obere Grenze der x-Achse holen und zu den x-Koordinaten mit deiner Funktionsgleichung die y-Werte berechnen. Aus den beiden Punkten kannst du eine Line2D.Double Instanz erzeugen und mit LineUtilities.clipLine(theLine, dataArea) den Teil der Linie berechnen, der innerhalb der Zeichenfläche liegt.
Klingt kompliziert, ist aber ganz einfach.


----------



## mukipi (6. Mai 2015)

Vielen Dank erstmal für beide Vorschläge! 

Ich werde erst einmal die XYAnnotation ausprobieren, das sieht so aus als könnte es mir helfen. Falls das nicht klappt les ich mich in JavaFX ein oder melde mich nochmal 

Dankeschön!


----------



## lam_tr (7. Mai 2015)

Also ich würde auch eher JavaFX Charts benutzen, weil man damit viel mehr machen kann, zumal JFreeChart auf Swing basiert und Javafx Swing Ablöser sein wird. Und übrigens kann man die Charts in JavaFX schön animieren und viel dynamischer anpassen. Wird auf jeden das richtige sein. Lohnt sich diese API anzugucken!


----------



## mukipi (7. Mai 2015)

Alles klar,
dann werd ich mich da auch nochmal reinlesen und dann entscheiden, was besser für mich passt.
Vielen Dank!


----------



## Harry Kane (7. Mai 2015)

lam_tr hat gesagt.:


> ...zumal JFreeChart auf Swing basiert und Javafx Swing Ablöser sein wird.


Jein. Ein ChartPanel ist zwar eine Swing-Komponente, aber JFreeChart braucht lediglich die Java2D API und kann auch ohne instanzen von javax.swing.JComponent oder java.awt.Component verwendet werden.
Und je nachdem wie fit der TE in javafx ist, sollte JFreeChart viiiiel einfacher zu verwenden sein.


----------



## lam_tr (8. Mai 2015)

Zu JFreeChart gibt es nur eine kommerzielle Doku, UI sieht meiner Meinung nicht gut aus. Padding und Zoomen geht's zwar aber sehr umständlich.

Alleine wegen Databinding und Animation spricht schon für JavaFX.


----------



## Harry Kane (8. Mai 2015)

lam_tr hat gesagt.:


> Zu JFreeChart gibt es nur eine kommerzielle Doku,


... und zahlreiche Tutorials.



lam_tr hat gesagt.:


> UI sieht meiner Meinung nicht gut aus


.. Geschmackssache und konfigurierbar. Mit gefällt bspw. das sanfte, pastellige Aussehen der Charts auf dem geposteten Link nichtso sehr. Ich will Daten analysieren und nicht das Kinderzimmer tapezieren.



lam_tr hat gesagt.:


> Padding und Zoomen geht's zwar aber sehr umständlich.


 Dragging mit der linken Maustaste = Zoom, wenn die Strg Taste gedrückt wird, wird gepant. Diese features müssen lediglich auf dem ChartPanel aktiviert werden.



lam_tr hat gesagt.:


> Alleine wegen Databinding und Animation spricht schon für JavaFX.


Animation: wers braucht... Und tanzende Balken in einem Balkendiagramm mit JFreeChart zu progammieren, ist auch nicht weiter schwer.
Databinding: Zumindest der Code in dem geposteten Link lässt für mich keinen Vorteil gegenüber JFreeChart erkennen. Was JFreeChart am Anfang vielleicht etwas schwieriger macht, ist die weitestgehend auf interfaces basierende Architektur. in javafx scheint alles auf Klassen zu basieren. Für fortgeschrittene Anwendungen IMHO ein klarer Nachteil.


----------



## lam_tr (8. Mai 2015)

> ... und zahlreiche Tutorials.



Hmmm ja nun gut ich weiß nicht genau wie jetzt tutorialmäßig aussieht, aber 2008 als ich damit angefangen habe, war kaum Tutorials da und hatte die kommerzielle Doku dazu gekauft.



> .. Geschmackssache und konfigurierbar. Mit gefällt bspw. das sanfte, pastellige Aussehen der Charts auf dem geposteten Link nichtso sehr.



Mag sein dass man da etwas konfigurieren kann, aber einfach ist es nicht. JavaFX lässt sich sehr schnell über CSS einstellen. Es ist einfach eine Auslegungssache, du willst schnell und einfach Daten auslesen. Ich lege da sehr viel Wert auf optisches Aussehen.

Ich denke wenn JFreeChart deine Anfoderungen ausreichen, dann ist es doch gut. Ich musste damals zu viel drum rum machen um auf das Ergebnis kommen zu können. Deswegen war ich von vorne rein schon begeistert von JavaFX. Die Lernkurve ist dabei auch nicht so hoch.

Architekonisch habe ich da noch nicht ins Detail geguckt, aber ja wenn die Charts nur auf Klassen/Basisklassen definiert sind, dann ist JFreeChart da schon vorteilhafter. Aber für reine Anwendung ist es nicht tragisch.

Trotzdem danke für die Aufklärung!


----------

