Multiple (4) axis and series bar charts

A discussion forum for JFreeChart (a 2D chart library for the Java platform).
Locked
kab
Posts: 3
Joined: Wed Feb 23, 2005 1:58 am
Location: Cambridge, MA, USA

Multiple (4) axis and series bar charts

Post by kab » Mon Oct 09, 2006 2:24 am

Hi,

First, I'm running 0.9.21, so if the problem described below is fixed, just
let me know.

I'm trying to extend DualAxisDemo5 to support four(4) series (0-based).
My example below almost works, but it overlays the two middle bars (numbers
1 and 2). I added null series as follows (referencing the 'real' series):
series 0: on the right;
series 1,2: on both sides;
series 3: on the left
[The axes placement and mappings work fine; I have axes 0,3 on the left, and 1,2 on the right.]

Here's the code:

Code: Select all

import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.chart.*;
import org.jfree.chart.axis.*;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.chart.renderer.category.CategoryItemRenderer;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.CategoryPlot;

import java.awt.*;
import java.io.File;
import java.io.IOException;

public class MultiAxisBars  extends ApplicationFrame
{
        //test:
    public static void main(String[] args)
    {
        String title = "MultiAxisBar Test - 4bars";
        Dimension initialSize = new Dimension(1000, 500);
        CategoryDataset[] weeksData = createTestDatasets();
        Color brown = new Color(0x8B, 0x45, 0x13);
        Color[] barColorList = {Color.blue, Color.red, Color.magenta, brown  };
        String[] rangeLabels = { "Num starts", "Score", "Num Moves", "Seconds"  };

        MultiAxisBars multi1AxisBars
                = new MultiAxisBars(weeksData, title, rangeLabels, initialSize, barColorList);
        multi1AxisBars.pack();
        RefineryUtilities.centerFrameOnScreen(multi1AxisBars);
        multi1AxisBars.setVisible(true);
    }
        //test data:
    private static CategoryDataset[] createTestDatasets()
    {
        String seriesdl = "LeftDummy";
        String seriesdr = "RightDummy";
        String seriesdr2 = "RightDummy2";

        String[] seriesLabels = {"Starts", "Ave score/game", "Ave moves/game", "Ave time/game" };

        String[] weekLabels = {"01-Sep-06", "25-Aug-06", "18-Aug-06", "11-Aug-06", "04-Aug-06",
                                "28-Jul-06", "21-Jul-06", "14-Jul-06", "07-Jul-06", "30-Jun-06", "23-Jun-06" };

        double[][] seriesValues = {
                        {1.0,     2.0,   4.0,   3.0,   5.0,   5.0,   4.0,   6.0,   5.0,   4.0,   6.0},
                        {3.0,     4.0,   3.0,   5.0,   6.0,   5.0,   8.0,   9.0,   8.0,  12.0,  13.0},
                        {213.0, 197.0, 190.0, 190.0, 186.0, 180.0, 186.0, 188.0, 160.0, 167.0, 155.0},
                        {313.0, 297.0, 290.0, 290.0, 286.0, 280.0, 286.0, 288.0, 260.0, 267.0, 255.0}
        };

        DefaultCategoryDataset[] result = new DefaultCategoryDataset[4];

        //---- dataset 0 ---
        int seriesIndex = 0;
        result[seriesIndex]= new DefaultCategoryDataset();

        for (int i=0; i<=10; i++){
            result[seriesIndex].addValue(seriesValues[seriesIndex][i], seriesLabels[seriesIndex], weekLabels[i]);
        };
            // rightside null series
        for (int i=0; i<=10; i++){ result[seriesIndex].addValue(null, seriesdr, weekLabels[i]); };


        //---- dataset 1 ---
        seriesIndex++;
        result[seriesIndex]= new DefaultCategoryDataset();
            // leftside null series
        for (int i=0; i<=10; i++){ result[seriesIndex].addValue(null, seriesdl, weekLabels[i]); };

        for (int i=0; i<=10; i++){
            result[seriesIndex].addValue(seriesValues[seriesIndex][i], seriesLabels[seriesIndex], weekLabels[i]);
        };
            // rightside null series
        for (int i=0; i<=10; i++){ result[seriesIndex].addValue(null, seriesdr, weekLabels[i]); };

        //---- dataset 2 ---
        seriesIndex++;
        result[seriesIndex]= new DefaultCategoryDataset();
            // leftside null series
        for (int i=0; i<=10; i++){ result[seriesIndex].addValue(null, seriesdl, weekLabels[i]); };

        for (int i=0; i<=10; i++){
            result[seriesIndex].addValue(seriesValues[seriesIndex][i], seriesLabels[seriesIndex], weekLabels[i]);
        };
            // rightside null series
        for (int i=0; i<=10; i++){ result[seriesIndex].addValue(null, seriesdr, weekLabels[i]); };

        //---- dataset 3 ---
        seriesIndex++;
        result[seriesIndex]= new DefaultCategoryDataset();
            // leftside null series
        for (int i=0; i<=10; i++){ result[seriesIndex].addValue(null, seriesdl, weekLabels[i]); };

        for (int i=0; i<=10; i++){
            result[seriesIndex].addValue(seriesValues[seriesIndex][i], seriesLabels[seriesIndex], weekLabels[i]);
        };
        return result;
    }

    public MultiAxisBars(final CategoryDataset[] weeksData,
                            String title,
                            String[] rangeLabels,
                            Dimension initialSize,
                            Color[] barColorList
                            )
    {
        super(title);
        CategoryAxis domainAxis = new CategoryAxis("Week Ending");
        domainAxis.setCategoryLabelPositions(CategoryLabelPositions.DOWN_45);
        NumberAxis[] rangeAxes = new NumberAxis[weeksData.length];
        BarRenderer[] renderers = new BarRenderer[weeksData.length];
        for (int i=0; i<weeksData.length; i++){
            rangeAxes[i] = new NumberAxis(rangeLabels[i]);
            rangeAxes[i].setAxisLinePaint(barColorList[i]);
            rangeAxes[i].setLabelPaint(barColorList[i]);
            rangeAxes[i].setTickLabelPaint(barColorList[i]);
            rangeAxes[i].setTickMarkPaint(barColorList[i]);
            renderers[i] = new BarRenderer();
            renderers[i].setPaint(barColorList[i]);
        }
        CategoryPlot plot =
            new CategoryPlot(weeksData[0], domainAxis, rangeAxes[0], renderers[0])
            {
                /**
                 * Override the getLegendItems() method to handle special case.
                 * @return the legend items.
                 */
                public LegendItemCollection getLegendItems()
                {
                    LegendItemCollection result = new LegendItemCollection();
                    for (int k=0; k < weeksData.length; k++)
                    {
                        CategoryDataset dataset_k = getDataset(k);
                        if (dataset_k != null)
                        {
                            CategoryItemRenderer renderer = getRenderer(k);
                            if (renderer != null)
                            {
                                LegendItem item = null;
                                if (k==0){
                                    item = renderer.getLegendItem(k, 0);
                                } else {
                                    item = renderer.getLegendItem(k, 1);
                                }
                                result.add(item);
                            }
                        }
                    }
                    return result;
                }
            };
        JFreeChart chart = new JFreeChart(title, plot);
        chart.setBackgroundPaint(Color.white);
        chart.getLegend().setAnchor(Legend.SOUTH);
        plot.setBackgroundPaint(new Color(0xEE, 0xEE, 0xFF));
        plot.setDomainAxisLocation(AxisLocation.BOTTOM_OR_RIGHT);
            // handle datasets/axes/rederers for i>0:
        for (int i=1; i<weeksData.length; i++)
        {
            plot.setDataset(i, weeksData[i]);
            plot.mapDatasetToRangeAxis(i, i);
            plot.setRangeAxis(i, rangeAxes[i]);
            plot.setRenderer(i, renderers[i]);
                // place axis#3 on left:
            if (i==3){
                plot.setRangeAxisLocation(i, AxisLocation.TOP_OR_LEFT);
            } else {
                plot.setRangeAxisLocation(i, AxisLocation.BOTTOM_OR_RIGHT);
            }
        }
        ChartPanel chartPanel = new ChartPanel(chart);
        setContentPane(chartPanel);
        chartPanel.setPreferredSize(initialSize);
    }
}
Thanks in advance,
Ken Bowen
[quote][/quote]

Locked