# JFreeChart - Line Shapes



## LukeVlbg (16. Sep 2009)

Ich arbeite gerade an einem LineChart. Dort kann man angeben, ob man eine Figur (Shape) für eine Linie haben möchte oder nicht.
Meine Frage: Ist es möglich *genau anzugeben* welche Linie welche Figur bekommen soll?

Danke für eure Hilfe.
Luke


----------



## SlaterB (16. Sep 2009)

gibt es denn mehrere Linien? wie meinst du das?
setSeriesShape() für verschiedene Serien im DataSet?


----------



## LukeVlbg (16. Sep 2009)

Hab ganz vergessen das Bild anzuhängen.
Es bestehen mehrere Linien, genau. Und jetzt möchte ich z.b. sagen die erste Linie soll Quadrate darstellen, die zweite Kreise, usw.

Was übergebe ich der Methode setSeriesShape(). Der erste Parameter ist ein int - also welche Serie und der zweite Parameter müsste Shape sein. Allerdings kann ich nicht direkt new Shape() übergeben..


----------



## SlaterB (16. Sep 2009)

das ist ja ein ganz anderes Problem,  Shape ist ein Interface, 

ähnliche Frage hatten wie hier
http://www.java-forum.org/awt-swing-swt/86892-jfreechart-einstellungen.html
> Bei renderer.setStroke(arg0) hab ich noch ein Problem. Was übergib ich dieser Methode? Also ein "Stroke" aber ich weiss nicht was ein Stroke ist.

versuche diesmal selber herauszufinden, welche Shapes es so gibt


----------



## LukeVlbg (16. Sep 2009)

Ok, hab mich mal auf die Suche begeben. Ist es das hier: Shape (Java 2 Platform SE 5.0)


----------



## SlaterB (16. Sep 2009)

na das war nun noch keine Suche, 
aber 'All Known Implementing Classes:' führt von dort aus weiter


----------



## LukeVlbg (16. Sep 2009)

Hab ich zwar zuvor auch schon angeschaut aber gut, ich wollte jetzt mal ein Viereck hinzufügen. Der folgende Code: 
	
	
	
	





```
renderer.setSeriesShape(0, new Rectangle());
```
 macht aber noch nicht ganz was er soll. Es kommen zwar Vierecke aber leider an der falschen Stelle.
Ich wollte ja beim Datensatz mit dem Index 0 und nicht 1.


----------



## SlaterB (16. Sep 2009)

in einem Code-Beispiel könnte ich nachschauen,
in dem Bild sind so viele verschiedene Formen, da kann man leicht vermuten, dass das Rectangle bei 1 der Standard ist und dein Befehl keine Wirklung hat weil wer weiß wo eingebaut


----------



## LukeVlbg (16. Sep 2009)

Aso, klar:


```
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Rectangle;
import java.awt.Shape;
import java.io.File;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;
import org.jfree.util.ShapeUtilities;

public class LineChart extends ApplicationFrame {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	public LineChart(final String title) {
		super(title);

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

	 /**
     * Creates a sample dataset.
     * 
     * @return a sample dataset.
     */
    private XYDataset createDataset() {
        
        final XYSeries series1 = new XYSeries("First");
        series1.add(1.0, 1.0);
        series1.add(2.0, 4.0);
        series1.add(3.0, 3.0);
        series1.add(4.0, 5.0);
        series1.add(5.0, 5.0);
        series1.add(6.0, 7.0);
        series1.add(7.0, 7.0);
        series1.add(8.0, 8.0);

        final XYSeries series2 = new XYSeries("Second");
        series2.add(1.0, 5.0);
        series2.add(2.0, 7.0);
        series2.add(3.0, 6.0);
        series2.add(4.0, 8.0);
        series2.add(5.0, 4.0);
        series2.add(6.0, 4.0);
        series2.add(7.0, 2.0);
        series2.add(8.0, 1.0);
        
        

        final XYSeries series3 = new XYSeries("Third");
        series3.add(3.0, 4.0);
        series3.add(4.0, 3.0);
        series3.add(5.0, 2.0);
        series3.add(6.0, 3.0);
        series3.add(7.0, 6.0);
        series3.add(8.0, 3.0);
        series3.add(9.0, 4.0);
        series3.add(10.0, 3.0);
        
        final XYSeries series4 = new XYSeries("Fourth");
        series4.add(3.0, 4.0);
        series4.add(2.0, 3.0);
        series4.add(5.0, 4.0);
        series4.add(8.0, 3.0);
        series4.add(7.0, 6.0);
        series4.add(8.0, 3.0);
        series4.add(1.0, 3.0);
        series4.add(5.0, 3.0);

        final XYSeries series5 = new XYSeries("Fifth");
        series5.add(2.0, 4.0);
        series5.add(2.0, 3.0);
        series5.add(4.0, 4.0);
        series5.add(6.0, 3.0);
        series5.add(7.0, 6.0);
        series5.add(8.0, 2.0);
        series5.add(2.0, 3.0);
        series5.add(6.0, 1.0);
        
        final XYSeries series6 = new XYSeries("Sixth");
        series6.add(3.0, 4.0);
        series6.add(4.0, 3.0);
        series6.add(5.0, 2.0);
        series6.add(6.0, 3.0);
        series6.add(7.0, 6.0);
        series6.add(8.0, 3.0);
        series6.add(9.0, 4.0);
        series6.add(10.0, 3.0);
        
        
        final XYSeries series7 = new XYSeries("Seventh");
        series7.add(1.0, 5.0);
        series7.add(2.0, 7.0);
        series7.add(3.0, 6.0);
        series7.add(4.0, 8.0);
        series7.add(5.0, 4.0);
        series7.add(6.0, 4.0);
        series7.add(7.0, 2.0);
        series7.add(8.0, 1.0);
        
        final XYSeries series8 = new XYSeries("Eighth");
        series8.add(3.0, 1.0);
        series8.add(2.0, 7.0);
        series8.add(3.0, 3.0);
        series8.add(5.0, 5.0);
        series8.add(2.0, 4.0);
        series8.add(6.0, 7.0);
        series8.add(7.0, 7.0);
        series8.add(3.0, 8.0);
        
        final XYSeriesCollection dataset = new XYSeriesCollection();
        dataset.addSeries(series1);
        dataset.addSeries(series2);
        dataset.addSeries(series3);
        dataset.addSeries(series4);
        dataset.addSeries(series5);
        dataset.addSeries(series6);
        dataset.addSeries(series7);
        dataset.addSeries(series8);
                
        return dataset;
        
    }
    
    /**
     * Creates a chart.
     * 
     * @param dataset  the data for the chart.
     * 
     * @return a chart.
     */
    private JFreeChart createChart(final XYDataset dataset) {
        
        // create the chart...
        final JFreeChart chart = ChartFactory.createXYLineChart(
            "Linien Chart",      // chart title
            "X",                      // x axis label
            "Y",                      // y axis label
            dataset,                  // data
            PlotOrientation.VERTICAL,
            true,                     // include legend
            true,                     // tooltips
            false                     // urls
        );

        // NOW DO SOME OPTIONAL CUSTOMISATION OF THE CHART...
        chart.setBackgroundPaint(Color.white);

//        final StandardLegend legend = (StandardLegend) chart.getLegend();
//        legend.setDisplaySeriesShapes(true);
        
        // get a reference to the plot for further customisation...
        final XYPlot plot = chart.getXYPlot();
        plot.setBackgroundPaint(Color.white);
//        plot.setAxisOffset(new Spacer(Spacer.ABSOLUTE, 5.0, 5.0, 5.0, 5.0));
        
        // Gitterlinien schwarz färben
        plot.setDomainGridlinePaint(Color.black);
        plot.setRangeGridlinePaint(Color.black);
        plot.setOutlinePaint(Color.black);
        plot.setDomainGridlinesVisible(false);
        plot.setRangeGridlinesVisible(false);
        
        final XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer();
//        renderer.setSeriesLinesVisible(0, true);
        renderer.setSeriesShapesVisible(0, true);
        renderer.setSeriesShape(0, new Rectangle());
//        renderer.setSeriesShapesFilled(0, false); // Markierungen bei Punkten hohl oder voll
        plot.setRenderer(renderer);
        
        // Linienstärke ändern
        plot.getRenderer().setSeriesStroke(0, new BasicStroke(2));
//        plot.getRenderer().setSeriesStroke(1, new BasicStroke(5));

        // change the auto tick unit selection to integer units only...
        final NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
        rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());

        return chart;
        
    }

    public static void main(final String[] args) {

        final LineChart demo = new LineChart("Linien Chart");
        demo.pack();
        RefineryUtilities.centerFrameOnScreen(demo);
        demo.setVisible(true);

    }
}
```


----------



## LukeVlbg (17. Sep 2009)

Hast du schon eine Idee?


----------



## SlaterB (17. Sep 2009)

shit, gesehen und dann vergessen wegen anderen Threads, kommt aber bald dran


----------



## LukeVlbg (17. Sep 2009)

Kein Problem, super


----------



## SlaterB (17. Sep 2009)

new Rectangle() bringt wenig, ist nicht sichtbar,
new Rectangle(10,10) macht schon dickere Klötze,

und wie vermutet werden die anderen Shapes automatisch erstellt, vergleiche das Bild mit einer Chart, wenn du kein eigenes Shape setzt,
warum und wo das passiert ist mal wieder etwas, was ich an JFreeChart lieber ganz ignoriere,
setze für alle Serien die Shapes die du haben möchtest, dann ist das eh egal


----------



## LukeVlbg (17. Sep 2009)

Das mit Rectangle funktioniert super, danke.
Aber was ich nicht ganz checke ist, wo Circle oder Triangle liegen. Das sind doch die offensichlichsten Shapes. Oder kann es sein, dass z.B. Ellipse2D ein Kreis ist?


----------



## SlaterB (17. Sep 2009)

Kreis heißt auf englisch
->
LEO Deutsch-Englisches Wörterbuch
(edit: ok, dort nicht zu finden, versuche Kreisbogen)

und nochmal die Liste 'All Known Implementing Classes:' durchgehen


----------



## LukeVlbg (17. Sep 2009)

Hm, eine Ellipse ist doch ein bisschen was anderes als ein Kreis: Ellipse - Wiki

Dachte ich zumindest. Aber scheint hier ein Kreis zu sein, wenn ich es mit den Parametern nicht zu weit Strecke.
Werd mir in dem Fall die anderen noch anschauen. Bin ja gespannt was ein Dreieck sein soll..


----------

