ChartFactory.createTimeSeriesChart bug ?

A free public discussion forum for the JFreeChart class library.

ChartFactory.createTimeSeriesChart bug ?

Postby morpheus » Tue Apr 01, 2003 12:37 pm

Here the source code of createTimeSeriesChart that I got from CVS

Code: Select all
public static JFreeChart createTimeSeriesChart(String title,
                                                   String timeAxisLabel,
                                                   String valueAxisLabel,
                                                   XYDataset data,
                                                   boolean legend,
                                                   boolean tooltips,
                                                   boolean urls) {

        ValueAxis timeAxis = new HorizontalDateAxis(timeAxisLabel);
        timeAxis.setLowerMargin(0.02);  // reduce the default margins on the time axis
        timeAxis.setUpperMargin(0.02);
        NumberAxis valueAxis = new VerticalNumberAxis(valueAxisLabel);

        valueAxis.setAutoRangeIncludesZero(false);  // override default
        XYPlot plot = new XYPlot(data, timeAxis, valueAxis);
       
        XYToolTipGenerator tooltipGenerator = null;
        if (tooltips) {
            tooltipGenerator = new TimeSeriesToolTipGenerator();
        }

        XYURLGenerator urlGenerator = null;
        if (urls) {
            urlGenerator = new StandardXYURLGenerator();
        }

        plot.setRenderer(new StandardXYItemRenderer(StandardXYItemRenderer.LINES,
                                                    tooltipGenerator, urlGenerator));
        JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT, plot, legend);

        return chart;

    }


I thing that order of


valueAxis.setAutoRangeIncludesZero(false); // override default
XYPlot plot = new XYPlot(data, timeAxis, valueAxis);


should be reversed, because since plot variable of valueAxis is not initialized, a call to valueAxis.setAutoRangeIncludesZero(false) will always return because of code of method autoAdjustRange() in class VerticalNumberAxis :

Code: Select all
protected void autoAdjustRange() {

        Plot plot = getPlot();

        // PLOT IS NOT INITIALIZED YET !!!

        if (plot == null) {
            return;  // no plot, no data
        }

        if (plot instanceof VerticalValuePlot) {

            VerticalValuePlot vvp = (VerticalValuePlot) plot;
            Range r = vvp.getVerticalDataRange(this);
            if (r == null) {
                r = new Range(DEFAULT_LOWER_BOUND, DEFAULT_UPPER_BOUND);
            }
            double lower = r.getLowerBound();
            double upper = r.getUpperBound();
            double range = upper - lower;

            // ensure the autorange is at least <minRange> in size...
            double minRange = getAutoRangeMinimumSize();
            if (range < minRange) {
                double expand = (minRange - range) / 2;
                upper = upper + expand;
                lower = lower - expand;
            }

            if (autoRangeIncludesZero()) {
                if (autoRangeStickyZero()) {
                    if (upper <= 0.0) {
                        upper = 0.0;
                    }
                    else {
                        upper = upper + getUpperMargin() * (upper - Math.min(lower, 0.0));
                    }
                    if (lower >= 0.0) {
                        lower = 0.0;
                    }
                    else {
                        lower = lower - getLowerMargin() * (upper - lower);
                    }
                }
                else {
                    range = Math.max(0.0, upper) - Math.min(0.0, lower);
                    upper = Math.max(0.0, upper + getUpperMargin() * range);
                    lower = Math.min(0.0, lower - getLowerMargin() * range);
                }
            }
            else {
                if (autoRangeStickyZero()) {
                    if (upper <= 0.0) {
                        upper = Math.min(0.0, upper + getUpperMargin() * range);
                    }
                    else {
                        upper = upper + getUpperMargin() * range;
                    }
                    if (lower >= 0.0) {
                        lower = Math.max(0.0, lower - getLowerMargin() * range);
                    }
                    else {
                        lower = lower - getLowerMargin() * range;
                    }
                }
                else {
                    upper = upper + getUpperMargin() * range;
                    lower = lower - getLowerMargin() * range;
                }
            }

            setRangeAttribute(new Range(lower, upper));
        }

    }


Regards
Morpheus
morpheus
 
Posts: 3
Joined: Sat Mar 22, 2003 5:47 pm

Postby david.gilbert » Tue Apr 01, 2003 4:58 pm

I'm not sure that it matters, because the auto range calculation will get called later anyway...in the XYPlot constructor, at least I think so.

Regards,

Dave Gilbert
david.gilbert
JFreeChart Project Leader
 
Posts: 11352
Joined: Fri Mar 14, 2003 10:29 am


Return to JFreeChart - General

Who is online

Users browsing this forum: Bing [Bot], Google [Bot], Yahoo [Bot] and 13 guests