# jfreechart, kursdiagramm erstellen



## schlumsch (27. Jan 2009)

Hallo allerseits,

ich möchte mit Java ein Diagramm erstellen, das ganze soll dann
so aussehen wenn es fertig ist: www.schlumsch.eu/e2e/plot.jpg
Bislang verwende ich JFreeChart zum zeichnen. Kann mir jemand sagen, ob ich mit
JFreeChart ein derartiges Diagramm basteln kann und was das für ein Diagrammtyp ist.
evtl. gibt es ja auch eine andere Möglichkeit ein derartigers Diagramm zu erstellen, auch
hier wäre ich für Tips Links code (*g*) dankbar.

Thx & lg[/img]


----------



## Ebenius (27. Jan 2009)

Ich bin mir nicht sicher, ob man das genauer abgrenzen muss. Aber wenn es keines ist, dann ähnelt es zumindest einem Gantt-Diagramm...


----------



## schlumsch (27. Jan 2009)

He das sieht sehr sehr gut aus, ich danke dir!


----------



## schlumsch (27. Jan 2009)

Aber so wie es aussieht, fangen die einzelnen "Bars" in diesem Diagramm immer erst dort an, wo die vorhergehende Bar aufhört. Sprich ist es möglich, dass meinetwegen Bar 1 zwischen den Werten 10 und 20 liegt, die Bar 2 zwischen 5 und 30?


----------



## Gast (27. Jan 2009)

Ja sicher geht das. Habe vor einer Woche selbst damit herumexperimentiert.

Hier ein Beispiel:
http://www.java2s.com/Code/Java/Chart/JFreeChartGanttDemo1.htm


----------



## schlumsch (27. Jan 2009)

Ja coole Sache, hab es eben auch selbst probiert und es geht super. Nun stellen sich noch ein paar weitere Fragen:

1. Kann ich die Bars selber beschriften? Sprich in (über) eine Bar einen Wert/String einfügen?
2. (wie) Kann ich die Achsenbeschriftungen formatieren? Hier sind manchmal nur die zeiten angegeben, selbst wenn die einzelnen Bars sich über 2 Tage hinweg ziehen.


----------



## Gast (27. Jan 2009)

zu 1. Man kann dem Renderer einen eigenen LabelGenerator zuweisen. Habe ich aber bisher nur für BarCharts gemacht. Es müsste allerdings auch bei Gantt-Diagrammen gehen. 
Ein Beispiel, wie es bei BarCharts geht gibts auch auf java2s.

zu 2. Das passiert normalerweise nur, wenn das Chart-Panel zu klein ist. Lösung hab ich aber keine.


----------



## schlumsch (27. Jan 2009)

Hmmm, wenn ud 1. schon mit Barcharts gemacht hast, dann würdest du mir einen riesigen Gefallen tun, indem du mir mal ein Beispielcode-Schnipsel zeigst. Neben dem Gantchart habe ich nämlich auch mit BCharts zu tun und dort eben die gleiche Aufgabe...

thx & lg


----------



## Guest (28. Jan 2009)

Naja, du erweiterst halt den StandardCategoryItemLabelGenerator mit dem was du brauchst. 
Einfaches Beispiel:


```
public class CustomItemLabelGenerator extends StandardCategoryItemLabelGenerator {

    @Override
    public String generateLabel(CategoryDataset dataset, int row, int column) {
        return dataset.getRowKey(row).toString();
    }
}
```

Hier wird jetzt einfach der RowKey, also was normalerweise in der Legende wäre zurückgegeben.

Dann wird der CustomItemLabelGenerator irgendwo bei der Chart-Generierung gesetzt:


```
//...
CategoryPlot plot = chart.getCategoryPlot();
CategoryItemRenderer render = plot.getRenderer();
render.setBaseItemLabelGenerator(new CustomItemLabelGenerator());
render.setBaseItemLabelsVisible(true);
//...
```

und fertig.


----------



## schlumsch (29. Jan 2009)

Krass, das funktioniert wunderbar und ich danke dir. Nun habe ich noch 2 weitere Fragen *g*

1.) Kann ich die Position, an welcher der Wert ausgegeben wird, ebenfalls verändern? Aus Platzgründen würde eine Ausgabe direkt über die einzelne Bar sehr praktisch sein.

2) Eine sicher kniffligere Frage zum Gantt. Hier bin ich nun an dem Punkt, wo alles wunderbar geht und mir nur noch die y-Achse oberhalb der Diagrammfläche fehlt. Wie man an dem Bildchen sieht (siehe erstes Posting) sollen dort 2 Zeitscalen erscheinen, welche die relevante Zeitspanne einmal in GETn und einmal in CMT anzeigen. Irgend eine Ahnung, wie man das umsetzt?

thx im Voraus & lg


----------



## MarcB (30. Jan 2009)

Hallo, hab mich mal hier angemeldet.

zu 1.

```
//ItemLabel Position
renderer.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12, TextAnchor.CENTER));
//Schriftgrößen
renderer.setBaseItemLabelFont(new Font("Verdana", Font.PLAIN, 10));
```

Deine 2. Frage kann ich dir leider auch nicht beantworten. Hab, wie oben erwähnt erst vor einer Woche angefangen mit den Gantt-Charts zu experimentieren und das auch nicht weiter getrieben als es für das Projekt nötig war.


----------



## schlumsch (30. Jan 2009)

Hehe,
ja dank dir. Wie sieht es aus du kannst mir doch sicher auch sagen, wie ich die Farbe der Balken selbst ändere. Irgendwie finde ich diese Ecke nicht.
Ansonsten, solltest du mal wieder mit den Gantts arbeiten müssen und auf ein ähnliches Problem stoßen, wie ich in 2., dann denk mal an mich


----------



## Guest (30. Jan 2009)

```
renderer.setSeriesPaint(0, Color.black);
```

Das eben für jede Series.


----------



## schlumsch (30. Jan 2009)

Danke. Noch eine wichtige Frage. Ich speichere bislang das Bild physisch auf HD und gebe es dann als Image aus. Gibt es auch eine Möglichkeit, das Bild auszugeben ohne dieses auf Platte zu speichern?


----------



## MarcB (30. Jan 2009)

Ja. Wie mans macht kommt auf die Anwendung an. 
Wenns ne Webanwendung ist, google mal nach Cewolf. In Swing erstellt man dafür ein ChartPanel, das man dann einfach da einfügt wo mans haben will.


```
ChartPanel chartPanel = new ChartPanel(chart);
```

Das leitet von JPanel ab. Kommt allerdings nicht mit jedem LayoutManager klar.


----------



## schlumsch (2. Feb 2009)

Hmmm, so wie ich das sehe funktioniert Cawolf nur für JSP right? Existiert auch eine Lösung für JSF?


----------



## MarcB (2. Feb 2009)

Grundsätzlich funktioniert alles was mit JSP funktioniert auch mit JSF.

Ansonsten hab ich im Java Magazin zu dem Thema mal das da gesehen.
Habs aber noch nicht ausprobiert.


----------



## schlumsch (2. Feb 2009)

Auf Jenia bin ich auch schon gestoßen. Wenn ich mir dort  ( http://www.jenia.org/jsp/chart.jsf ) allerdings die versionshinweise anschaue, dann unterstützen die nur 2 Charttypen: PieChart2D und  BarChart2D. Ich brauche den barchart und Ganttchart. Bei cewolf blicke ich nicht durch, wie man das mit jsf implementiert.


----------



## schlumsch (3. Feb 2009)

...und noch einmal eine Frage an die Runde. Kann (und wenn ja wie) ich in einem Barplot auch doubles anzeigen, sprich werte mit 2 Nachkommastellen?

thx & lg


----------



## MarcB (3. Feb 2009)

Habe leider nicht viel Zeit, deshalb nur ne Antwort auf die letzte Frage.
Double hat nicht nur 2 Nachkommastellen, aber ich nehme an du willst z.B. eine Währung anzeigen. Falls ich damit richtig liege könnte der folgende Code hilfreich sein:

```
DecimalFormat labelFormatter = new DecimalFormat("##,###.00€");
        labelFormatter.setNegativePrefix("(");
        labelFormatter.setNegativeSuffix(")");
        chart.getCategoryPlot().getRenderer().setItemLabelGenerator(
            new StandardCategoryItemLabelGenerator("{2}", labelFormatter)
        );
        chart.getCategoryPlot().getRenderer().setItemLabelsVisible(true);
```

Ist frei aus einem älteren Projekt kopiert (also nicht meckern wenns so nicht mehr geht).

Die geschweifte Klammer im Konstruktor gibt die Achse an (hier also die Y-Achse).


----------



## schlumsch (4. Feb 2009)

Jo,klappt vorzüglich


----------



## schlumsch (17. Feb 2009)

...und da bin ich wieder 
2 Fragen hab ich da noch:

1.) Kann man eigentlich in einem Barplot die Breite der einzelnen Bars festlegen,
ohne die Maße des gesammten Diagrammes anzufassen? 

2.) Man kann für ein ganzes Diahgramm einen Tooltip - also ein Infofenster bei mouseover festlegen. Kann man dies auch für einzelne Bars tun, derart das z.B die beschriftung der y-Achse der jeweilichen Bar ausgegeben wird, wenn der benutzer über die einzelne Bar mit der Maus fährt? Die Erweiterung wäre dann, ein onklick zu erfassen, wenn der Nutzer auf eine Bar klickt... Hat da jemand Ahnung???

Danke euch, lg schlumsch


----------



## SlaterB (17. Feb 2009)

hey, nicht doppelt fragen, siehe neuen Thread


----------

