/* * AreaPlot.java * * Copyright (c) 2002-2015 Alexei Drummond, Andrew Rambaut and Marc Suchard * * This file is part of BEAST. * See the NOTICE file distributed with this work for additional * information regarding copyright ownership and licensing. * * BEAST is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * BEAST is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with BEAST; if not, write to the * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, * Boston, MA 02110-1301 USA */ package dr.app.gui.chart; import dr.stats.Variate; import java.awt.*; import java.awt.geom.GeneralPath; import java.util.List; /** * Description: An area plot. * * @author Andrew Rambaut * @author Alexei Drummond * @version $Id: AreaPlot.java,v 1.4 2005/05/24 20:25:59 rambaut Exp $ */ public class AreaPlot extends Plot.AbstractPlot { protected Variate.N xData2 = null; protected Variate.N yData2 = null; /** * Constructor */ public AreaPlot(Variate.N xData, Variate.N yData) { super(xData, yData); } /** * Constructor */ public AreaPlot(List<Double> xData, List<Double> yData) { super(xData, yData); } /** * Constructor */ public AreaPlot(Variate.N xData1, Variate.N yData1, Variate.N xData2, Variate.N yData2) { super(xData1, yData1); this.xData2 = xData2; this.yData2 = yData2; } /** * Constructor */ public AreaPlot(List<Double> xData1, List<Double> yData1, List<Double> xData2, List<Double> yData2) { super(xData1, yData1); this.xData2 = new Variate.D(xData2); this.yData2 = new Variate.D(yData2); } /** * Set data */ public void setData(List<Double> xData1, List<Double> yData1, List<Double> xData2, List<Double> yData2) { setData(xData1, yData1); this.xData2 = new Variate.D(xData2); this.yData2 = new Variate.D(yData2); } /** * Set data */ public void setData(Variate.N xData1, Variate.N yData1, Variate.N xData2, Variate.N yData2) { setData(xData1, yData1); this.xData2 = xData2; this.yData2 = yData2; } /** * Set axes */ public void setAxes(Axis xAxis, Axis yAxis) { super.setAxes(xAxis, yAxis); if (xData2 != null && yData2 != null) { setupAxis(xAxis, yAxis, xData2, yData2); } } /** * Resets axis ranges (if new data has been added) */ public void resetAxes() { super.resetAxes(); if (xData2 != null && yData2 != null) { setupAxis(xAxis, yAxis, xData2, yData2); } } /** * Paint data series */ protected void paintData(Graphics2D g2, Variate.N xData, Variate.N yData) { double x0 = transformX(((Number) xData.get(0)).doubleValue()); double y0 = transformY(((Number) yData.get(0)).doubleValue()); GeneralPath path = new GeneralPath(); path.moveTo((float) x0, (float) y0); double x = x0; double y = y0; for (int i = 1, n = xData.getCount(); i < n; i++) { x = transformX(((Number) xData.get(i)).doubleValue()); y = transformY(((Number) yData.get(i)).doubleValue()); path.lineTo((float) x, (float) y); } if (xData2 != null & yData2 != null) { for (int i = xData2.getCount() - 1; i >= 0; i--) { x = transformX(((Number) xData2.get(i)).doubleValue()); y = transformY(((Number) yData2.get(i)).doubleValue()); path.lineTo((float) x, (float) y); } } else { double y1 = transformY(0.0); path.lineTo((float) x, (float) y1); path.lineTo((float) x0, (float) y1); path.lineTo((float) x0, (float) y0); } path.closePath(); g2.setPaint(linePaint); g2.setStroke(lineStroke); g2.fill(path); } }