# JFreeChart - Legende beliebig positionieren



## LukeVlbg (14. Jul 2009)

Hallo,

ist es möglich die *Legende *in einem Chart *beliebig *zu *positionieren*?
Sie befindet sich ja standardmäßig unter dem Chart. Kann ich sie auch oberhalb und seitlich des Charts positionieren?

Noch eine kleine Frage:
Kann man den Effekt, dass die Balken eines Balkendiagramms einen Schatten werfen ausschalten? Also kann man die weisse Linie auf dem Balken entfernen?

Lg
Luke


----------



## SlaterB (15. Jul 2009)

LegendTitle legend = chart.getLegend();
legend.setPosition(RectangleEdge.RIGHT);

Schatten ist mir noch nicht aufgefallen,
wenn das noch aktuell ist, poste bitte ein kleines Beispielprogramm mit deiner Konfiguration


----------



## LukeVlbg (20. Jul 2009)

Vielen Dank für die Antwort. Funktioniert wunderbar.

Das mit dem 3D-Effekt ist in folgendem Programm zu sehen. Das Codestück ist direkt aus einem Tutorial.


```
package org.jfree.chart.demo;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.GradientPaint;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.CategoryLabelPositions;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;

/**
 * A simple demonstration application showing how to create a bar chart.
 *
 */
public class BarChartDemo extends ApplicationFrame {

    /**
     * Creates a new demo instance.
     *
     * @param title  the frame title.
     */
    public BarChartDemo(final String title) {

        super(title);

        final CategoryDataset dataset = createDataset();
        final JFreeChart chart = createChart(dataset);
        final ChartPanel chartPanel = new ChartPanel(chart);
        chartPanel.setPreferredSize(new Dimension(500, 270));
        setContentPane(chartPanel);

    }

    /**
     * Returns a sample dataset.
     * 
     * @return The dataset.
     */
    private CategoryDataset createDataset() {
        
        // row keys...
        final String series1 = "First";
        final String series2 = "Second";
        final String series3 = "Third";

        // column keys...
        final String category1 = "Category 1";
        final String category2 = "Category 2";
        final String category3 = "Category 3";
        final String category4 = "Category 4";
        final String category5 = "Category 5";

        // create the dataset...
        final DefaultCategoryDataset dataset = new DefaultCategoryDataset();

        dataset.addValue(1.0, series1, category1);
        dataset.addValue(4.0, series1, category2);
        dataset.addValue(3.0, series1, category3);
        dataset.addValue(5.0, series1, category4);
        dataset.addValue(5.0, series1, category5);

        dataset.addValue(5.0, series2, category1);
        dataset.addValue(7.0, series2, category2);
        dataset.addValue(6.0, series2, category3);
        dataset.addValue(8.0, series2, category4);
        dataset.addValue(4.0, series2, category5);

        dataset.addValue(4.0, series3, category1);
        dataset.addValue(3.0, series3, category2);
        dataset.addValue(2.0, series3, category3);
        dataset.addValue(3.0, series3, category4);
        dataset.addValue(6.0, series3, category5);
        
        return dataset;
        
    }
    
    /**
     * Creates a sample chart.
     * 
     * @param dataset  the dataset.
     * 
     * @return The chart.
     */
    private JFreeChart createChart(final CategoryDataset dataset) {
        
        // create the chart...
        final JFreeChart chart = ChartFactory.createBarChart(
            "Bar Chart Demo",         // chart title
            "Category",               // domain axis label
            "Value",                  // range axis label
            dataset,                  // data
            PlotOrientation.VERTICAL, // orientation
            true,                     // include legend
            true,                     // tooltips?
            false                     // URLs?
        );

        // NOW DO SOME OPTIONAL CUSTOMISATION OF THE CHART...

        // set the background color for the chart...
        chart.setBackgroundPaint(Color.white);

        // get a reference to the plot for further customisation...
        final CategoryPlot plot = chart.getCategoryPlot();
        plot.setBackgroundPaint(Color.lightGray);
        plot.setDomainGridlinePaint(Color.white);
        plot.setRangeGridlinePaint(Color.white);

        // set the range axis to display integers only...
        final NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
        rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());

        // disable bar outlines...
        final BarRenderer renderer = (BarRenderer) plot.getRenderer();
        renderer.setDrawBarOutline(false);

        final CategoryAxis domainAxis = plot.getDomainAxis();
        domainAxis.setCategoryLabelPositions(
            CategoryLabelPositions.createUpRotationLabelPositions(Math.PI / 6.0)
        );
        // OPTIONAL CUSTOMISATION COMPLETED.
        
        return chart;
        
    }
    
    // ****************************************************************************
    // * JFREECHART DEVELOPER GUIDE                                               *
    // * The JFreeChart Developer Guide, written by David Gilbert, is available   *
    // * to purchase from Object Refinery Limited:                                *
    // *                                                                          *
    // * [url=http://www.object-refinery.com/jfreechart/guide.html]Object Refinery Limited - JFreeChart[/url]                     *
    // *                                                                          *
    // * Sales are used to provide funding for the JFreeChart project - please    * 
    // * support us so that we can continue developing free software.             *
    // ****************************************************************************
    
    /**
     * Starting point for the demonstration application.
     *
     * @param args  ignored.
     */
    public static void main(final String[] args) {

        final BarChartDemo demo = new BarChartDemo("Bar Chart Demo");
        demo.pack();
        RefineryUtilities.centerFrameOnScreen(demo);
        demo.setVisible(true);

    }

}
```

Auf den Balken erkennt man links einen weißen Strich und rechts (ganz leicht) einen grauen Strich.

lg


----------



## SlaterB (20. Jul 2009)

ich will ja nichts beschwören, aber ohne Lupe sehe ich da bei mir gar nix,
liegt vielleicht an der Version, ich benutze 1.0.4

evtl. kannst du was mit
        renderer.setOutlinePaint(Color.BLACK);
        renderer.setDrawBarOutline(true);
anfangen


----------



## LukeVlbg (20. Jul 2009)

Stimmt bei deinem Bild sieht man überhaupt nichts - *so* stelle ich mir das vor.

Meine Version ist allerdings: 1.0.13

Bei mir sieht das ganze so aus:


----------



## LukeVlbg (20. Jul 2009)

Wenn ich den Code-Snippet einbau kommt bei mir dieser Fehler:



> The method setDrawBarOutline(boolean) is undefined for the type CategoryItemRenderer


----------



## SlaterB (20. Jul 2009)

tja, das war eben die ältere Version,
hab nun die neue installiert

        renderer.setShadowVisible(false);
        renderer.setBarPainter(new StandardBarPainter());

immer wieder eine Freude, undokumentierte Features in JFreeChart umzuändern


----------



## LukeVlbg (20. Jul 2009)

Stimmt liegt wirklich nur an der Version 1.0.13 das das so dargestellt wird.

Habs probiert einzubauen, er kennt aber die Methoden _setShadwoVisible_ und _setbarPainter_ nicht.

Kann es sein das ich statt dem CategoryItemRenderer einen anderen Renderer nehmen muss?


----------



## SlaterB (20. Jul 2009)

siehe das obige Beispiel
plot.getRenderer(); liefert CategoryItemRenderer
->
 final BarRenderer renderer = (BarRenderer)plot.getRenderer();

funktioniert natürlich nur, wenn auch wirklich ein BarRenderer vorliegt,
das dürfte aber der Fall sein, wenn du Bars siehst


----------



## LukeVlbg (20. Jul 2009)

Wunderbar, jetzt funktioniert es .

Hatte es versehentlich in ein anderes Projekt getan. Dort geht es um ein BarChart mit Bars von denen ich die Farbe selbst bestimmen kann.

Kurzer Auszug:

```
final CategoryItemRenderer renderer = new CustomRenderer(
				new Paint[] {Color.red, Color.blue, Color.green, // Farben, die verwendet werden
					Color.yellow, Color.orange, Color.cyan,
					Color.magenta}
		);
```

Dort müsste man doch den Schatten auch ausschalten können?


----------



## SlaterB (20. Jul 2009)

CustomRenderer scheint keine JFreeChart-Klasse zu sein


----------



## LukeVlbg (20. Jul 2009)

Gibt es sonst eine Möglichkeit die Farben der Balken manuell zu vergeben?


----------



## SlaterB (20. Jul 2009)

es gibt alles, einfach ausprobieren/ Beispiele anschauen
        renderer.setSeriesPaint(0, Color.RED);
        renderer.setSeriesPaint(1, Color.GREEN);

und meine Geduld geht zu Ende


----------



## LukeVlbg (20. Jul 2009)

Ok, danke für deine Hilfestellung und Zeit. 
Werd dann mal weitertüfteln.


----------



## Gast2 (20. Jul 2009)

SlaterB hat gesagt.:


> es gibt alles, einfach ausprobieren/ Beispiele anschauen
> renderer.setSeriesPaint(0, Color.RED);
> renderer.setSeriesPaint(1, Color.GREEN);
> 
> und meine Geduld geht zu Ende



damit hab ich auch schon mal was probiert
http://www.java-forum.org/awt-swing-swt/85613-jfreechart-balken-einfaerben.html

bei mir klappt die sache nicht


----------



## SlaterB (20. Jul 2009)

da ist die Methode nicht schuld


----------



## LukeVlbg (20. Jul 2009)

Bei JFreeChart funktioniert es.

Vielleicht ist es bei JFrame eine andere Methode.


----------

