# jFreechart - Diagramm formatieren



## DirkHo (13. Dezember 2009)

Hallo,

ich habe jetzt die letzten paar Tage mit jFreechart (1.0.1) herumprobiert - leider kann ich nur diese etwas ältere Version verwenden - und versucht, ein Diagramm meinen Ansprüchen nach anzupassen.







So sieht es derzeit aus. So hätte ich es gerne:






Was ich zwischen ist und soll gerne ändern würde ist folgendes:

Die Beschriftung der Achsen soll in dem gleichen dunkel-grau sein wie auch die Achsen selbst.

Das Raster hinter den Balken und der Rahmen um das Diagramm sollte durchgezogen sein und in der gleichen Farbe wie auch die Achsen.

Die Balken selbst sollen keine Border haben.

Die Balken sollten 75px breit sein.

Nice to have wäre:

Die y-Achsen-Beschriftung oberhalb der y-Achse

Die Umrandung um die Farben der Legende weg,

Die Farbblöcke etwas größer.

Könntet ihr mir da bitte helfen? Ich habe da schon etliches versucht zu ergooglen, in der API gesucht, aber ich finde keine passenden Methoden.

Hier mal mein Quellcode (ist nicht wirklich schön, aber da zu Testzwecken noch in keine speziellen Methoden verpackt,...):


```
class StackBar {

    public CategoryDataset createDataset() {
        double[][] data = new double[][]{
            {370,300}, // orangene Werte
            {0,50}, // dunkel-blaue Werte
            {0,20}, // hell-blaue Werte
        };

        String[] achsen = new String[] {"Alt", "Neu"};
        String[] leg = new String[] {"Wert 1", "Wert 2", "Wert 3"};
  
        return DatasetUtilities.createCategoryDataset(leg, achsen, data);
    }
    
    public JFreeChart createChart(final CategoryDataset dataset) {

        final JFreeChart chart = ChartFactory.createStackedBarChart(
                null, null, null,
                dataset, PlotOrientation.VERTICAL, true, true, false);

        chart.setBackgroundPaint(new Color(249, 231, 236));

        CategoryPlot plot = chart.getCategoryPlot();

        plot.getRenderer().setSeriesPaint(0, new Color(237, 100, 202));
        plot.getRenderer().setSeriesPaint(1, new Color(1, 207, 38));
        plot.getRenderer().setSeriesPaint(2, new Color(24, 24, 24));        
        plot.setDomainGridlineStroke(new BasicStroke(2));        
        plot.setOutlinePaint(new Color(137,138,140));

        return chart;
}


class Blubb {

	public static void main(...) {
	
		StackBar sb = new StackBar();
		
		CategoryDataset dataset = sb.createDataset();

		JFreeChart chart = sb.createChart(dataset);

        Plot plot = chart.getPlot();
        chart.setBackgroundPaint(new Color(238,238,250));
        plot.setBackgroundPaint(new Color(238,238,250));
        chart.setBorderPaint(new Color(137,138,140));
        
        chart.getLegend().setPosition(RectangleEdge.RIGHT);
        chart.getLegend().setVerticalAlignment(VerticalAlignment.CENTER);
        chart.getLegend().setBackgroundPaint(new Color(238,238,250));
        chart.getLegend().setBorder(BlockBorder.NONE);

        ChartPanel chartPanel = new ChartPanel(chart);
               
        File file = new File("D:\\bla.png");
        chartPanel.setPreferredSize(new java.awt.Dimension(500, 270));
        try {
        ChartUtilities.saveChartAsPNG(file, chart, 500, 270);
        } catch(IOException e) {
        	System.out.println("Fehler mit Grafik");
        }
}
```

Könnt ihr mir bitte sagen, mit welchen Methoden/wie ich das ganze so formatieren kann, wie ich es gerne hätte?

Vielen Dank und viele Grüße,

Dirk


----------



## miffi (14. Dezember 2009)

Howdie.

Da klingelt was bei mir.... Ist allerdings eine Weile her, dass ich mit JFreeChart gearbeitet habe... Während der Arbeit komme ich heute nicht dazu, meinen alten Code durchzuschauen, aber vielleicht heut abend oder morgen. 

Falls ich was brauchbares finde, was dir weiterhilft, melde ich mich.

Gruß
miffi


----------



## DirkHo (14. Dezember 2009)

Hi miffi,

super, vielen Dank! Wäre klasse, wenn du da Anschauungsmaterial hättest. Ich werde nichts desto trotz weitersuchen - vielleicht finde ich ja noch was und würde das dann posten, dann müsstest du dir nicht die Mühe machen und den Code durchsuchen.

Vielen Dank auf jeden Fall schon mal und viele Grüße,

Dirk


----------



## miffi (14. Dezember 2009)

Hi DirkHo.

Ich hab jetzt grad mal über meinen Code und die API geschaut. Prinzipiell hab ich ziemlich andere Grafen erstellt als du - dynamische Time Series über eine Round Robin Datenbank. Aber vielleicht kann ich ja mit dem ein oder anderen Denk- bzw. Probieranstoß dienen.

Vor vorn herein: Wenn mal eine Methode nicht existiert, die ich hier aufführe, kann es sein, dass du deinen Renderer oder deinen Plot in eine spezialisiertere Form casten musst. Nur mal so als Beispiel: _BarRenderer renderer = (BarRenderer) plot.getRenderer()_.



DirkHo hat gesagt.:


> Die Beschriftung der Achsen soll in dem gleichen dunkel-grau sein wie auch die Achsen selbst.


In deinen Bildern sieht man, dass du die Labels der einzelnen Balken in einer anderen Farbe haben willst. Das tut man soweit ich weiß über _renderer.setItemLabelPaint(Color.blubb)_. Wie das jetzt bei allen Beschriftungen funktioniert, weiß ich nicht... Aber du musst einfach mal rumprobieren, prinzipiell besteht alles aus irgendwelchen Items oder Labels, deren Vor- und Hintergrundfarben du über die gewohnten Methoden setzen kannst.


> Das Raster hinter den Balken und der Rahmen um das Diagramm sollte durchgezogen sein und in der gleichen Farbe wie auch die Achsen


Hier verstehe ich nicht ganz was du meinst.  Du kannst auf jeden Fall über _plot.setRangeGridlinePaint(Color.blubb)_ die Farbe des Rasters ändern und über _plot.setBackgroundPaint(Color.blubb)_ die Hintergrundfarbe (also zwischen den Raster-Linien) ändern.


> Die Balken selbst sollen keine Border haben


Versuch mal _renderer.setDrawBarOutline(false);_


> Die Balken sollten 75px breit sein.


Mit Pixeln kann ich nicht dienen... Aber du könntest es über Prozente anpassen: _renderer.setMaximumBarWidth(0.30)_ beispielsweise setzt die Balken-Breite auf 30% des Gesamt-Plots.


> Die y-Achsen-Beschriftung oberhalb der y-Achse


Dazu die Beschriftung oberhalb zu setzen habe ich nicht die geringste Info gefunden... Ich glaube fast, das ist nicht möglich.... Natürlich unter Vorbehalt 

Falls du überhaupt keine Beschriftung hast (wie es in dem ersten Bild aussieht), kannst du aber eine setzen. Das geht an dieser Stelle deines Codes:

```
final JFreeChart chart = ChartFactory.createStackedBarChart(
                null, null, null,
                dataset, PlotOrientation.VERTICAL, true, true, false);
```
Das zweite und dritte Argument (in diesem Fall "null") sind die Achs-Beschriftungen. Hier kannst du entsprechende Strings übergeben.


Zum Rest kann ich dir leider nichts sagen... Gerade mit den Legenden usw. kenn ich mich kaum aus, außerdem gibt JFreeChart da nicht sehr viel Infos her. Vor allem aber hab ich schon seit ner Weile nicht mehr damit gearbeitet 

Ich hoffe, ich konnte dir trotzdem helfen.

Gruß
miffi


----------



## DirkHo (15. Dezember 2009)

Hi miffi,

vielen Dank für deine ausführliche Antwort!



miffi hat gesagt.:


> In deinen Bildern sieht man, dass du die Labels der einzelnen Balken in einer anderen Farbe haben willst. Das tut man soweit ich weiß über _renderer.setItemLabelPaint(Color.blubb)_.


Das habe ich über plot.getRenderer().setSeriesPaint(...) gesteuert.



miffi hat gesagt.:


> Wie das jetzt bei allen Beschriftungen funktioniert, weiß ich nicht... Aber du musst einfach mal rumprobieren, prinzipiell besteht alles aus irgendwelchen Items oder Labels, deren Vor- und Hintergrundfarben du über die gewohnten Methoden setzen kannst.



Das bekomme ich wie folgt hin (für die Achsen - bei der X-Achse ist es DomainAxis, wobei man das über TickLabel steuern muss):

        CategoryAxis cA = plot.getDomainAxis();
        cA.setLabelPaint(new Color(137,138,140));
        cA.setTickLabelPaint(new Color(137,138,140));
        cA.setTickLabelFont(new Font("Arial", Font.PLAIN, 11));



miffi hat gesagt.:


> Hier verstehe ich nicht ganz was du meinst.  Du kannst auf jeden Fall über _plot.setRangeGridlinePaint(Color.blubb)_ die Farbe des Rasters ändern



Das war's, was ich suchte 



miffi hat gesagt.:


> Versuch mal _renderer.setDrawBarOutline(false);_
> 
> Mit Pixeln kann ich nicht dienen... Aber du könntest es über Prozente anpassen: _renderer.setMaximumBarWidth(0.30)_ beispielsweise setzt die Balken-Breite auf 30% des Gesamt-Plots.



Super, das hat geklappt



miffi hat gesagt.:


> Dazu die Beschriftung oberhalb zu setzen habe ich nicht die geringste Info gefunden... Ich glaube fast, das ist nicht möglich.... Natürlich unter Vorbehalt



Ich habe zwar gefunden, wie ich die Beschriftung drehe, aber wie ich sie nach oben setze habe ich nichts gefunden. Falls ich das noch hinbekomme ok, falls nicht, dann eben nicht 



miffi hat gesagt.:


> Falls du überhaupt keine Beschriftung hast (wie es in dem ersten Bild aussieht), kannst du aber eine setzen. Das geht an dieser Stelle deines Codes:



Ok, das habe/hatte ich und klappt auch.



miffi hat gesagt.:


> Zum Rest kann ich dir leider nichts sagen... Gerade mit den Legenden usw. kenn ich mich kaum aus, außerdem gibt JFreeChart da nicht sehr viel Infos her. Vor allem aber hab ich schon seit ner Weile nicht mehr damit gearbeitet



Danke, das war schon alles mehr als genug Hilfe! Bisschen was habe ich ja auch noch selbst hinbekommen. So weit sieht das Ganze so aus, wie ich es wollte -> das passt schon 

Vielen Dank nochmals und viele Grüße,

Dirk


----------

