I created the following demo to demonstrate what I think is a bug in XYDifferenceRenderer.
Every thing is ok, if at line 35 the code "inverse(time)" is inactive. If however, as in the demo, I inverse the x-axis values (before creating the dataset), the Renderer draws only lines.
P.S. I added the method "inverse" to org.jfree.util.ArrayUtilities. Perhaps you might want to add it, too.
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.XYDifferenceRenderer;
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 DifferenceRendererTest extends JFrame{
/** Creates a new instance of Main */
public DifferenceRendererTest() {
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
double[] time = new double[] {0, 1, 2, 3, 4, 5, 6, 7, 8};
double[][] data = new double [][] {{0, 1, 2, 3, 4, 5, 6, 7, 8}, {0, 1, 2, 3, 7, 8, 6, 7, 8}};
//Here is the point!
inverse(time);
DefaultXYDataset dataset = new DefaultXYDataset();
dataset.addSeries("s1", new double[][] {time, data[0]});
dataset.addSeries("s2", new double[][] {time, data[1]});
NumberAxis xAxis = new NumberAxis();
NumberAxis yAxis = new NumberAxis("yAxis");
XYPlot plot = new XYPlot(dataset, xAxis, yAxis, new XYDifferenceRenderer(Color.GREEN, Color.RED, false));
JFreeChart chart = new JFreeChart("DifferenceRenderer 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) {
DifferenceRendererTest m = new DifferenceRendererTest();
m.setVisible(true);
m.pack();
}
public static void inverse(double[] a) {
double half = a.length/2;
for ( int i = 0; i < half; i++) {
double swap = a[i];
a[i] = a[a.length-1-i];
a[a.length-1-i] = swap;
}
}
}