org.fhcrc.cpl.toolbox.gui.chart.PanelWithLineChart.java Source code

Java tutorial

Introduction

Here is the source code for org.fhcrc.cpl.toolbox.gui.chart.PanelWithLineChart.java

Source

/*
 * Copyright (c) 2003-2012 Fred Hutchinson Cancer Research Center
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.fhcrc.cpl.toolbox.gui.chart;

import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.renderer.xy.StandardXYItemRenderer;
import org.jfree.chart.renderer.xy.XYBarRenderer;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.labels.XYToolTipGenerator;
import org.jfree.chart.labels.XYItemLabelGenerator;
import org.jfree.data.xy.XYSeriesCollection;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYDataset;

import java.awt.geom.Ellipse2D;
import java.awt.*;
import java.awt.event.MouseEvent;

/**
 * PanelWithChart implementation to make it easy to put out Line Charts
 * If you want to do anything super-serious with the chart, use
 * getChart() and getRenderer()
 */
public class PanelWithLineChart extends PanelWithChart {
    protected XYSeriesCollection dataset;
    protected NumberAxis xAxis = new NumberAxis("X");
    protected NumberAxis yAxis = new NumberAxis("Y");

    protected StandardXYItemRenderer renderer = null;

    public static Shape defaultShape = new Ellipse2D.Double(-1, -1, 3, 3);

    protected static Color[] seriesColors = new Color[] { Color.BLUE, Color.RED, Color.CYAN, Color.ORANGE,
            Color.MAGENTA, Color.PINK, Color.GREEN, Color.YELLOW };

    public PanelWithLineChart() {
        super();
        init();
    }

    public PanelWithLineChart(java.util.List<? extends Number> xValuesList,
            java.util.List<? extends Number> yValuesList, String dataSetName) {
        this();

        addData(xValuesList, yValuesList, dataSetName);
        setName(dataSetName);

    }

    public PanelWithLineChart(double[] xValues, double[] yValues, String dataSetName) {
        this();
        addData(xValues, yValues, dataSetName);
        setName(dataSetName);

    }

    public PanelWithLineChart(int[] xValues, int[] yValues, String dataSetName) {
        this();
        addData(xValues, yValues, dataSetName);
        setName(dataSetName);

    }

    public PanelWithLineChart(float[] xValues, float[] yValues, String dataSetName) {
        this();
        addData(xValues, yValues, dataSetName);
        setName(dataSetName);
    }

    public PanelWithLineChart(double[] xValues, double[] yValues, String dataSetName, Shape shape, Color color) {
        this();
        addData(xValues, yValues, dataSetName, shape, color);
        setName(dataSetName);

    }

    protected void init() {
        dataset = new XYSeriesCollection();
        renderer = new StandardXYItemRenderer();
        renderer.setPlotLines(true);
        renderer.setBaseShapesVisible(false);

        //set all possible series to the default shape
        for (int i = 0; i < 10; i++)
            renderer.setSeriesShape(i, defaultShape);

        XYToolTipGenerator toolTipGenerator = new XYToolTipGenerator() {
            public String generateToolTip(XYDataset xyDataset, int s, int i) {
                double X = Math.round(xyDataset.getXValue(s, i) * 1000.0) / 1000.0;
                double Y = Math.round(xyDataset.getYValue(s, i) * 1000.0) / 1000.0;

                return "(" + X + ", " + Y + ")";
            }
        };

        //dhmay adding for jfreechart 1.0.6 upgrade.  If this isn't here, we get a
        //nullPointerException in XYBarRenderer.drawItemLabel
        renderer.setBaseItemLabelGenerator(new NullLabelGenerator());

        renderer.setSeriesItemLabelsVisible(0, true);
        renderer.setBaseToolTipGenerator(toolTipGenerator);

        _chart = ChartFactory.createXYLineChart(null, null, null, dataset, PlotOrientation.VERTICAL, true, true,
                false);

        _chart.getXYPlot().setRenderer(renderer);
        init(_chart);
    }

    /**
     * This should not be necessary.  dhmay creating this class for the jfreechart 1.0.6 upgrade.
     * We shouldn't have to specify a labelgenerator at all for the barchart
     *
     */
    protected static class NullLabelGenerator implements XYItemLabelGenerator {
        public String generateLabel(XYDataset dataset, int series, int item) {
            return null;
        }
    }

    public void setAxisLabels(String xLabel, String yLabel) {
        xAxis.setLabel(xLabel);
        yAxis.setLabel(yLabel);
    }

    protected Color getDefaultColorForSeries(int index) {
        if (index >= seriesColors.length)
            index = index % seriesColors.length;
        return seriesColors[index];
    }

    public void addData(java.util.List<? extends Number> xValuesList, java.util.List<? extends Number> yValuesList,
            String dataSetName) {
        double[] xValues = new double[xValuesList.size()];
        double[] yValues = new double[yValuesList.size()];
        for (int i = 0; i < xValues.length; i++) {
            xValues[i] = xValuesList.get(i).doubleValue();
            yValues[i] = yValuesList.get(i).doubleValue();
        }

        addData(xValues, yValues, dataSetName);

    }

    public void addData(int[] xValues, int[] yValues, String dataSetName) {
        double[] xValuesDouble = new double[xValues.length];
        double[] yValuesDouble = new double[yValues.length];

        for (int i = 0; i < xValues.length; i++) {
            xValuesDouble[i] = xValues[i];
            yValuesDouble[i] = yValues[i];
        }
        addData(xValuesDouble, yValuesDouble, dataSetName, defaultShape,
                getDefaultColorForSeries(dataset.getSeriesCount()));
    }

    public void addData(float[] xValues, float[] yValues, String dataSetName) {
        double[] xValuesDouble = new double[xValues.length];
        double[] yValuesDouble = new double[yValues.length];

        for (int i = 0; i < xValues.length; i++) {
            xValuesDouble[i] = xValues[i];
            yValuesDouble[i] = yValues[i];
        }
        addData(xValuesDouble, yValuesDouble, dataSetName, defaultShape,
                getDefaultColorForSeries(dataset.getSeriesCount()));
    }

    public void addData(double[] xValues, double[] yValues, String dataSetName) {
        addData(xValues, yValues, dataSetName, defaultShape, getDefaultColorForSeries(dataset.getSeriesCount()));
    }

    public void addData(double[] xValues, double[] yValues, String dataSetName, Shape shape, Color color) {
        if (xValues.length != yValues.length)
            throw new RuntimeException("PanelWithLineChart: x and y values have different cardinality ("
                    + -xValues.length + " and " + yValues.length + ")");

        XYSeries series = new XYSeries(dataSetName);

        for (int i = 0; i < xValues.length; i++) {
            series.add(xValues[i], yValues[i]);
        }
        dataset.addSeries(series);
        setSeriesColor(dataset.getSeriesCount() - 1, color);
    }

    public void addDataFloat(float[] xValues, float[] yValues, String dataSetName, Shape shape, Color color) {
        double[] xValuesDouble = new double[xValues.length];
        double[] yValuesDouble = new double[yValues.length];

        for (int i = 0; i < xValues.length; i++) {
            xValuesDouble[i] = xValues[i];
            yValuesDouble[i] = yValues[i];
        }
        addData(xValuesDouble, yValuesDouble, dataSetName, shape, color);
    }

    public void addSeries(XYSeries series) {
        dataset.addSeries(series);
    }

    public void setSeriesColor(int i, Color color) {
        renderer.setSeriesPaint(i, color);
    }

    XYSeries getDataSeries(int i) {
        return dataset.getSeries(i);
    }

    public StandardXYItemRenderer getRenderer() {
        return renderer;
    }

    public NumberAxis getXAxis() {
        return xAxis;
    }

    public NumberAxis getYAxis() {
        return yAxis;
    }
}