Equal legend items in CombinedRangeXYPlot (with running demo

A discussion forum for JFreeChart (a 2D chart library for the Java platform).
Locked
tomkieffer
Posts: 24
Joined: Wed May 16, 2007 8:20 am

Equal legend items in CombinedRangeXYPlot (with running demo

Post by tomkieffer » Thu Dec 13, 2007 9:29 am

In my CombinedRangeXYPlot all legend items are equal (to the series name of the last series added). I created the very simple demo below to reproduce what I mean.
Either I have a really stupid error in my code that I can't see or it's a bug. Just try the demo.

Code: Select all

package bugfinder;

import java.awt.BorderLayout;
import java.awt.Color;
import java.util.Arrays;
import javax.swing.JFrame;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.CombinedDomainXYPlot;
import org.jfree.chart.plot.CombinedRangeXYPlot;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.chart.title.LegendTitle;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.xy.DefaultXYDataset;
import org.jfree.util.ArrayUtilities;

/**
 *
 * @author Kieffer
 */
public class CombinedRangeLegendBug extends JFrame{
    
    /** Creates a new instance of Main */
    public CombinedRangeLegendBug() {

        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        double[] time = new double[] {0, 1, 2, 3};
        double[][] data = new double [][] {{0, 1, 2, 3}, {1, 2, 3, 4}, {2, 3, 4, 5}};
        
        
        DefaultXYDataset[] dataset = new DefaultXYDataset[3];
        XYPlot[] plots = new XYPlot[3];
        NumberAxis[] xAxes = new NumberAxis[3];
        NumberAxis yAxis = new NumberAxis("yAxis");
        CombinedRangeXYPlot plot = new CombinedRangeXYPlot(yAxis);
        
        //Datasets, Formats, Plots
        for (int i = 0; i < 3; i++) {
            
            xAxes[i] = new NumberAxis("xAxis");
            
            dataset[i] = new DefaultXYDataset();
            dataset[i].addSeries("series_"+i, new double[][] {time, data[i]});
            
            plots[i] = new XYPlot();
            plots[i].setDataset(dataset[i]);
            plots[i].setDomainAxis(xAxes[i]);
            
            plot.add (plots[i]);
        }
        
        XYLineAndShapeRenderer xylasr = new XYLineAndShapeRenderer(true, false);
        plot.setRenderer(xylasr);
        
        JFreeChart chart = new JFreeChart("Legends test", plot);
        chart.setBackgroundPaint(Color.WHITE);
        LegendTitle legend = chart.getLegend();
        legend.setBorder(0.0, 0.0, 0.0, 0.0);
        ChartPanel cp = new ChartPanel(chart);
        
        this.setLayout(new BorderLayout());
        ((BorderLayout)(this.getLayout())).setVgap(20);
        this.setBackground(Color.WHITE);
        this.add(cp, BorderLayout.CENTER);   
    }
    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        CombinedRangeLegendBug m = new CombinedRangeLegendBug();
        m.setVisible(true);
        m.pack();
    }
    
}

tomkieffer
Posts: 24
Joined: Wed May 16, 2007 8:20 am

different renderers for different plots

Post by tomkieffer » Tue Dec 18, 2007 2:03 pm

Every subplot needs its own renderer. The error was to set the renderer only once for CombinedDomainXYPlot and not for every subplot.

At this time, I don't really see why CombindexDomainXYPlot should extend the plot class hierarchy at all, as every subplot is a complete and functionally independant plot and the use of current plot methods like setRenderer() leads to unexpected behaviour.

Locked