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
Changing Shapes v9.5
Re: Changing Shapes v9.5
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);
}
}
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);
}
}
Re: Changing Shapes v9.5
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
Regards,
Dave Gilbert
Re: Changing Shapes v9.5
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
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
Re: Changing Shapes v9.5
Hi Sjakie,
Can you post a small application that replicates the problem?
Regards,
Dave Gilbert
Can you post a small application that replicates the problem?
Regards,
Dave Gilbert