/*
* ErrorBarPlot.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 error bar plot (to be put under a scatter plot).
*
* @author Andrew Rambaut
* @version $Id: LinePlot.java,v 1.8 2005/05/24 20:25:59 rambaut Exp $
*/
public class ErrorBarPlot extends Plot.AbstractPlot {
public enum Orientation {
HORIZONTAL,
VERTICAL
}
/**
* Constructor
*/
public ErrorBarPlot(Orientation orientation, Variate.N xData, Variate.N yData, Variate.N errorData) {
super(xData, yData);
this.errorData = errorData;
this.orientation = orientation;
}
/**
* Constructor
*/
public ErrorBarPlot(Orientation orientation, List<Double> xData, List<Double> yData, List<Double> errorData) {
super(xData, yData);
this.errorData = new Variate.D(errorData);
this.orientation = orientation;
}
/**
* Paint data series
*/
protected void paintData(Graphics2D g2, Variate.N xData, Variate.N yData) {
g2.setPaint(linePaint);
g2.setStroke(lineStroke);
int n = xData.getCount();
for (int i = 0; i < n; i++) {
GeneralPath path = new GeneralPath();
double x0 = ((Number) xData.get(i)).doubleValue();
double y0 = ((Number) yData.get(i)).doubleValue();
double e = ((Number) errorData.get(i)).doubleValue() / 2;
float fx = (float)transformX(x0);
float fy = (float)transformY(y0);
if (!Double.isInfinite(fx) && !Double.isInfinite(fy) &&
!Double.isNaN(fx) && !Double.isNaN(fy)) {
if (orientation == Orientation.HORIZONTAL) {
float fx1 = (float)transformX(x0 - e);
float fx2 = (float)transformX(x0 + e);
path.moveTo(fx, fy);
path.lineTo(fx1, fy);
path.moveTo(fx, fy);
path.lineTo(fx2, fy);
} else if (orientation == Orientation.VERTICAL) {
float fy1 = (float)transformY(y0 - e);
float fy2 = (float)transformY(y0 + e);
path.moveTo(fx, fy);
path.lineTo(fx, fy1);
path.moveTo(fx, fy);
path.lineTo(fx, fy2);
}
}
g2.draw(path);
}
}
private Orientation orientation;
protected Variate.N errorData = null;
}