Changing Shapes v9.5

A discussion forum for JFreeChart (a 2D chart library for the Java platform).
Locked
Hugo

Changing Shapes v9.5

Post by Hugo » Tue Feb 11, 2003 6:32 am

Hi,
I am having difficulty in changing the series shapes to a customised specific order of shapes i.e. I have 4 series of data on a TimeSeriesChart. I need the shapes in the order of circle, filled square, outline square, and cross. I have used the following code to try and change the shape of the first series but it is not rendering. I have done a system.out of the name of the shape and it is still set to Rectangle2D

StandardXYItemRenderer xyItemRenderer = new StandardXYItemRenderer(StandardXYItemRenderer.SHAPES_AND_LINES);

plot.setRenderer(xyItemRenderer);

xyItemRenderer.setSeriesShape(0,new Ellipse2D.Double(5d, 5d, 5d, 5d));

System.out.println(xyItemRenderer.getSeriesShape(0,0).toString());


I have bought the Developers Documentation but there isn't much in the way of changing shapes?????

Am I missing something like a listener update, or am I suppose to use something like a ShapeTable???

Kind Regards
Hugo

David Gilbert

Re: Changing Shapes v9.5

Post by David Gilbert » Tue Feb 11, 2003 8:00 am

Hi Hugo,

I can't see a problem with what you are doing. As a test, I've put together a short demo that changes the shapes to: circle, square, triangle, cross. The code is pasted below.

JFreeChart doesn't allow control over filling or not filling the shapes at the series level yet...I've added this as feature request 684424 on SourceForge. It should get implemented before 1.0.0 is released.

I'm still working on the documentation for 0.9.5, the current release is a draft. I will add some more info about setting shapes for the renderers.

Regards,

Dave Gilbert

package com.jrefinery.chart.demo;

import java.awt.geom.Ellipse2D;
import java.awt.geom.GeneralPath;
import java.awt.geom.Rectangle2D;
import java.text.SimpleDateFormat;

import com.jrefinery.chart.JFreeChart;
import com.jrefinery.chart.ChartFactory;
import com.jrefinery.chart.ChartPanel;
import com.jrefinery.chart.StandardLegend;
import com.jrefinery.chart.axis.DateAxis;
import com.jrefinery.chart.plot.XYPlot;
import com.jrefinery.chart.renderer.XYItemRenderer;
import com.jrefinery.chart.renderer.StandardXYItemRenderer;
import com.jrefinery.data.TimeSeries;
import com.jrefinery.data.Day;
import com.jrefinery.data.XYDataset;
import com.jrefinery.data.TimeSeriesCollection;
import com.jrefinery.ui.ApplicationFrame;
import com.jrefinery.ui.RefineryUtilities;

/**
* An example of a time series chart.
*
* @author David Gilbert
*/
public class TimeSeriesDemo9 extends ApplicationFrame {

/**
* A demonstration application showing how to create a simple time series chart. This
* example uses monthly data.
*
* @param title the frame title.
*/
public TimeSeriesDemo9(String title) {

super(title);

// create a title...
String chartTitle = "Test";
XYDataset dataset = createDataset();

JFreeChart chart = ChartFactory.createTimeSeriesChart(chartTitle, "Date", "Price Per Unit",
dataset,
true,
true,
false);

StandardLegend sl = (StandardLegend) chart.getLegend();
sl.setDisplaySeriesShapes(true);

XYPlot plot = chart.getXYPlot();
XYItemRenderer renderer = plot.getRenderer();
if (renderer instanceof StandardXYItemRenderer) {
StandardXYItemRenderer rr = (StandardXYItemRenderer) renderer;
rr.setPlotShapes(true);
rr.setDefaultShapeFilled(true);
rr.setSeriesShape(0, new Ellipse2D.Double(-3.0, -3.0, 6.0, 6.0));
rr.setSeriesShape(1, new Rectangle2D.Double(-3.0, -3.0, 6.0, 6.0));
GeneralPath s2 = new GeneralPath();
s2.moveTo(0.0f, -3.0f);
s2.lineTo(3.0f, 3.0f);
s2.lineTo(-3.0f, 3.0f);
s2.closePath();
rr.setSeriesShape(2, s2);
GeneralPath s3 = new GeneralPath();
s3.moveTo(-1.0f, -3.0f);
s3.lineTo(1.0f, -3.0f);
s3.lineTo(1.0f, -1.0f);
s3.lineTo(3.0f, -1.0f);
s3.lineTo(3.0f, 1.0f);
s3.lineTo(1.0f, 1.0f);
s3.lineTo(1.0f, 3.0f);
s3.lineTo(-1.0f, 3.0f);
s3.lineTo(-1.0f, 1.0f);
s3.lineTo(-3.0f, 1.0f);
s3.lineTo(-3.0f, -1.0f);
s3.lineTo(-1.0f, -1.0f);
s3.closePath();
rr.setSeriesShape(3, s3);
}
ChartPanel chartPanel = new ChartPanel(chart);
chartPanel.setPreferredSize(new java.awt.Dimension(500, 270));
setContentPane(chartPanel);

}

public XYDataset createDataset() {

TimeSeriesCollection dataset = new TimeSeriesCollection();
for (int i = 0; i < 4; i++) {
dataset.addSeries(createTimeSeries(i, 10));
}
return dataset;

}

/**
* Creates a dataset, consisting of two series of monthly data.
*
* @return the dataset.
*/
public TimeSeries createTimeSeries(int series, int count) {

TimeSeries result = new TimeSeries("Series " +series , Day.class);

Day start = new Day();
for (int i = 0; i < count; i++) {
result.add(start, Math.random());
start = (Day) start.next();
}

return result;

}

/**
* Starting point for the demonstration application.
*
* @param args ignored.
*/
public static void main(String[] args) {

TimeSeriesDemo9 demo = new TimeSeriesDemo9("Time Series Demo 9");
demo.pack();
RefineryUtilities.centerFrameOnScreen(demo);
demo.setVisible(true);

}

}

David Gilbert

Re: Changing Shapes v9.5

Post by David Gilbert » Tue Feb 11, 2003 9:34 am

I forgot to add, it is important that the shapes you define are centered about (0, 0). JFreeChart will then translate the shape to the required location. The size is not critical, you can choose whatever size looks good on your chart.

Regards,

Dave Gilbert

Sjakie Glas

Re: Changing Shapes v9.5

Post by Sjakie Glas » Mon Mar 03, 2003 10:18 am

Hi David,

I have a problem, too, changing the *default* shapes and strokes using StandardXYItemRenderer.setDefaultStroke(Stroke stroke) and StandardXYItemRenderer.setDefaultShape(Shape shape).

When I try to set the default, no effects can be seen in the charts... When I use
myTemperatureRenderer.setSeriesShape(0, new Rectangle(1,1));
it works perfectly!

Is this is bug or am I something missing here?

Regards,

Sjakie

David Gilbert

Re: Changing Shapes v9.5

Post by David Gilbert » Tue Mar 04, 2003 7:55 am

Hi Sjakie,

Can you post a small application that replicates the problem?

Regards,

Dave Gilbert

Locked