jFreechart - Diagramm formatieren

DirkHo

Erfahrenes Mitglied
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.

istz.png


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

soll.png


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,...):

Code:
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
 
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
 
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
 
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().

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:
Java:
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
 
Zuletzt bearbeitet:
Hi miffi,

vielen Dank für deine ausführliche Antwort!

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.

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));

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 ;)

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

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 ;)

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.

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
 
Zurück