Search in sources :

Example 6 with OutlierListCollection

use of org.jfree.chart.renderer.OutlierListCollection in project ES-LEI-2Sem-2022-Grupo-1 by tmrbo-iscte.

the class XYBoxAndWhiskerRenderer method drawVerticalItem.

/**
 * Draws the visual representation of a single data item.
 *
 * @param g2  the graphics device.
 * @param dataArea  the area within which the plot is being drawn.
 * @param info  collects info about the drawing.
 * @param plot  the plot (can be used to obtain standard color
 *              information etc).
 * @param domainAxis  the domain axis.
 * @param rangeAxis  the range axis.
 * @param dataset  the dataset (must be an instance of
 *                 {@link BoxAndWhiskerXYDataset}).
 * @param series  the series index (zero-based).
 * @param item  the item index (zero-based).
 * @param crosshairState  crosshair information for the plot
 *                        ({@code null} permitted).
 * @param pass  the pass index.
 */
public void drawVerticalItem(Graphics2D g2, Rectangle2D dataArea, PlotRenderingInfo info, XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, int series, int item, CrosshairState crosshairState, int pass) {
    // setup for collecting optional entity info...
    EntityCollection entities = null;
    if (info != null) {
        entities = info.getOwner().getEntityCollection();
    }
    BoxAndWhiskerXYDataset boxAndWhiskerData = (BoxAndWhiskerXYDataset) dataset;
    Number x = boxAndWhiskerData.getX(series, item);
    Number yMax = boxAndWhiskerData.getMaxRegularValue(series, item);
    Number yMin = boxAndWhiskerData.getMinRegularValue(series, item);
    Number yMedian = boxAndWhiskerData.getMedianValue(series, item);
    Number yAverage = boxAndWhiskerData.getMeanValue(series, item);
    Number yQ1Median = boxAndWhiskerData.getQ1Value(series, item);
    Number yQ3Median = boxAndWhiskerData.getQ3Value(series, item);
    List yOutliers = boxAndWhiskerData.getOutliers(series, item);
    // that case...
    if (yOutliers == null) {
        yOutliers = Collections.EMPTY_LIST;
    }
    double xx = domainAxis.valueToJava2D(x.doubleValue(), dataArea, plot.getDomainAxisEdge());
    RectangleEdge location = plot.getRangeAxisEdge();
    double yyMax = rangeAxis.valueToJava2D(yMax.doubleValue(), dataArea, location);
    double yyMin = rangeAxis.valueToJava2D(yMin.doubleValue(), dataArea, location);
    double yyMedian = rangeAxis.valueToJava2D(yMedian.doubleValue(), dataArea, location);
    double yyAverage = 0.0;
    if (yAverage != null) {
        yyAverage = rangeAxis.valueToJava2D(yAverage.doubleValue(), dataArea, location);
    }
    double yyQ1Median = rangeAxis.valueToJava2D(yQ1Median.doubleValue(), dataArea, location);
    double yyQ3Median = rangeAxis.valueToJava2D(yQ3Median.doubleValue(), dataArea, location);
    double yyOutlier;
    double exactBoxWidth = getBoxWidth();
    double width = exactBoxWidth;
    double dataAreaX = dataArea.getMaxX() - dataArea.getMinX();
    double maxBoxPercent = 0.1;
    double maxBoxWidth = dataAreaX * maxBoxPercent;
    if (exactBoxWidth <= 0.0) {
        int itemCount = boxAndWhiskerData.getItemCount(series);
        exactBoxWidth = dataAreaX / itemCount * 4.5 / 7;
        if (exactBoxWidth < 3) {
            width = 3;
        } else if (exactBoxWidth > maxBoxWidth) {
            width = maxBoxWidth;
        } else {
            width = exactBoxWidth;
        }
    }
    g2.setPaint(getItemPaint(series, item));
    Stroke s = getItemStroke(series, item);
    g2.setStroke(s);
    // draw the upper shadow
    g2.draw(new Line2D.Double(xx, yyMax, xx, yyQ3Median));
    g2.draw(new Line2D.Double(xx - width / 2, yyMax, xx + width / 2, yyMax));
    // draw the lower shadow
    g2.draw(new Line2D.Double(xx, yyMin, xx, yyQ1Median));
    g2.draw(new Line2D.Double(xx - width / 2, yyMin, xx + width / 2, yyMin));
    // draw the body
    Shape box;
    if (yyQ1Median > yyQ3Median) {
        box = new Rectangle2D.Double(xx - width / 2, yyQ3Median, width, yyQ1Median - yyQ3Median);
    } else {
        box = new Rectangle2D.Double(xx - width / 2, yyQ1Median, width, yyQ3Median - yyQ1Median);
    }
    if (this.fillBox) {
        g2.setPaint(lookupBoxPaint(series, item));
        g2.fill(box);
    }
    g2.setStroke(getItemOutlineStroke(series, item));
    g2.setPaint(getItemOutlinePaint(series, item));
    g2.draw(box);
    // draw median
    g2.setPaint(getArtifactPaint());
    g2.draw(new Line2D.Double(xx - width / 2, yyMedian, xx + width / 2, yyMedian));
    // average radius
    double aRadius = 0;
    // outlier radius
    double oRadius = width / 3;
    // draw average - SPECIAL AIMS REQUIREMENT
    if (yAverage != null) {
        aRadius = width / 4;
        // before drawing it...
        if ((yyAverage > (dataArea.getMinY() - aRadius)) && (yyAverage < (dataArea.getMaxY() + aRadius))) {
            Ellipse2D.Double avgEllipse = new Ellipse2D.Double(xx - aRadius, yyAverage - aRadius, aRadius * 2, aRadius * 2);
            g2.fill(avgEllipse);
            g2.draw(avgEllipse);
        }
    }
    List outliers = new ArrayList();
    OutlierListCollection outlierListCollection = new OutlierListCollection();
    /* From outlier array sort out which are outliers and put these into
         * an arraylist. If there are any farouts, set the flag on the
         * OutlierListCollection
         */
    for (int i = 0; i < yOutliers.size(); i++) {
        double outlier = ((Number) yOutliers.get(i)).doubleValue();
        if (outlier > boxAndWhiskerData.getMaxOutlier(series, item).doubleValue()) {
            outlierListCollection.setHighFarOut(true);
        } else if (outlier < boxAndWhiskerData.getMinOutlier(series, item).doubleValue()) {
            outlierListCollection.setLowFarOut(true);
        } else if (outlier > boxAndWhiskerData.getMaxRegularValue(series, item).doubleValue()) {
            yyOutlier = rangeAxis.valueToJava2D(outlier, dataArea, location);
            outliers.add(new Outlier(xx, yyOutlier, oRadius));
        } else if (outlier < boxAndWhiskerData.getMinRegularValue(series, item).doubleValue()) {
            yyOutlier = rangeAxis.valueToJava2D(outlier, dataArea, location);
            outliers.add(new Outlier(xx, yyOutlier, oRadius));
        }
        Collections.sort(outliers);
    }
    // outlier list or a new outlier list is made
    for (Iterator iterator = outliers.iterator(); iterator.hasNext(); ) {
        Outlier outlier = (Outlier) iterator.next();
        outlierListCollection.add(outlier);
    }
    // draw yOutliers
    double maxAxisValue = rangeAxis.valueToJava2D(rangeAxis.getUpperBound(), dataArea, location) + aRadius;
    double minAxisValue = rangeAxis.valueToJava2D(rangeAxis.getLowerBound(), dataArea, location) - aRadius;
    // draw outliers
    for (Iterator iterator = outlierListCollection.iterator(); iterator.hasNext(); ) {
        OutlierList list = (OutlierList) iterator.next();
        Outlier outlier = list.getAveragedOutlier();
        Point2D point = outlier.getPoint();
        if (list.isMultiple()) {
            drawMultipleEllipse(point, width, oRadius, g2);
        } else {
            drawEllipse(point, oRadius, g2);
        }
    }
    // draw farout
    if (outlierListCollection.isHighFarOut()) {
        drawHighFarOut(aRadius, g2, xx, maxAxisValue);
    }
    if (outlierListCollection.isLowFarOut()) {
        drawLowFarOut(aRadius, g2, xx, minAxisValue);
    }
    // add an entity for the item...
    if (entities != null && box.intersects(dataArea)) {
        addEntity(entities, box, dataset, series, item, xx, yyAverage);
    }
}
Also used : OutlierList(org.jfree.chart.renderer.OutlierList) Stroke(java.awt.Stroke) Shape(java.awt.Shape) Rectangle2D(java.awt.geom.Rectangle2D) ArrayList(java.util.ArrayList) Line2D(java.awt.geom.Line2D) Paint(java.awt.Paint) Ellipse2D(java.awt.geom.Ellipse2D) Outlier(org.jfree.chart.renderer.Outlier) EntityCollection(org.jfree.chart.entity.EntityCollection) Point2D(java.awt.geom.Point2D) OutlierListCollection(org.jfree.chart.renderer.OutlierListCollection) Iterator(java.util.Iterator) ArrayList(java.util.ArrayList) OutlierList(org.jfree.chart.renderer.OutlierList) List(java.util.List) BoxAndWhiskerXYDataset(org.jfree.data.statistics.BoxAndWhiskerXYDataset) RectangleEdge(org.jfree.chart.api.RectangleEdge)

Aggregations

Paint (java.awt.Paint)6 Shape (java.awt.Shape)6 Stroke (java.awt.Stroke)6 Ellipse2D (java.awt.geom.Ellipse2D)6 Line2D (java.awt.geom.Line2D)6 Point2D (java.awt.geom.Point2D)6 Rectangle2D (java.awt.geom.Rectangle2D)6 ArrayList (java.util.ArrayList)6 Iterator (java.util.Iterator)6 EntityCollection (org.jfree.chart.entity.EntityCollection)6 Outlier (org.jfree.chart.renderer.Outlier)6 OutlierList (org.jfree.chart.renderer.OutlierList)6 OutlierListCollection (org.jfree.chart.renderer.OutlierListCollection)6 List (java.util.List)5 RectangleEdge (org.jfree.ui.RectangleEdge)4 BoxAndWhiskerCategoryDataset (org.jfree.data.statistics.BoxAndWhiskerCategoryDataset)3 BoxAndWhiskerXYDataset (org.jfree.data.statistics.BoxAndWhiskerXYDataset)3 RectangleEdge (org.jfree.chart.api.RectangleEdge)2