Example usage for org.jfree.data.xy XYIntervalSeries XYIntervalSeries

List of usage examples for org.jfree.data.xy XYIntervalSeries XYIntervalSeries

Introduction

In this page you can find the example usage for org.jfree.data.xy XYIntervalSeries XYIntervalSeries.

Prototype

public XYIntervalSeries(Comparable key) 

Source Link

Document

Creates a new empty series.

Usage

From source file:org.esa.snap.rcp.statistics.ProfilePlotPanel.java

private void updateDataSet() {
    if (!isInitialized) {
        return;/* w w  w .j  a  va2 s .c om*/
    }

    dataset.removeAllSeries();

    double dx = 0.5 * dataSourceConfig.boxSize;

    if (profileData != null) {
        final float[] sampleValues = profileData.getSampleValues();
        final float[] sampleSigmas = profileData.getSampleSigmas();
        XYIntervalSeries series = new XYIntervalSeries(
                getRaster() != null ? getRaster().getName() : DEFAULT_SAMPLE_DATASET_NAME);
        for (int x = 0; x < sampleValues.length; x++) {
            final float y = sampleValues[x];
            final float dy = sampleSigmas[x];
            series.add(x, x - dx, x + dx, y, y - dy, y + dy);
        }
        dataset.addSeries(series);

        if (dataSourceConfig.useCorrelativeData && dataSourceConfig.pointDataSource != null
                && dataSourceConfig.dataField != null) {

            XYIntervalSeries corrSeries = new XYIntervalSeries(StatisticChartStyling
                    .getCorrelativeDataLabel(dataSourceConfig.pointDataSource, dataSourceConfig.dataField));
            int[] shapeVertexIndexes = profileData.getShapeVertexIndexes();
            SimpleFeature[] simpleFeatures = dataSourceConfig.pointDataSource.getFeatureCollection()
                    .toArray(new SimpleFeature[0]);

            if (shapeVertexIndexes.length == simpleFeatures.length) {
                int fieldIndex = getAttributeIndex(dataSourceConfig.pointDataSource,
                        dataSourceConfig.dataField);
                if (fieldIndex != -1) {
                    for (int i = 0; i < simpleFeatures.length; i++) {
                        Number attribute = (Number) simpleFeatures[i].getAttribute(fieldIndex);
                        if (attribute != null) {
                            final double x = shapeVertexIndexes[i];
                            final double y = attribute.doubleValue();
                            corrSeries.add(x, x, x, y, y, y);
                        }
                    }
                    dataset.addSeries(corrSeries);
                }
            } else {
                System.out.println("Weird things happened:");
                System.out.println("  shapeVertexIndexes.length = " + shapeVertexIndexes.length);
                System.out.println("  simpleFeatures.length     = " + simpleFeatures.length);
            }

        }

        profilePlotDisplay.restoreAutoBounds();
        xAxisRangeControl.getBindingContext().setComponentsEnabled(PROPERTY_NAME_MARK_SEGMENTS,
                profileData.getShapeVertices().length > 2);
    }
}

From source file:org.esa.beam.visat.toolviews.stat.ProfilePlotPanel.java

private void updateDataSet() {
    if (!isInitialized) {
        return;/*from   ww  w  .j  av  a 2 s .c om*/
    }

    dataset.removeAllSeries();

    double dx = 0.5 * dataSourceConfig.boxSize;

    if (profileData != null) {
        final float[] sampleValues = profileData.getSampleValues();
        final float[] sampleSigmas = profileData.getSampleSigmas();
        XYIntervalSeries series = new XYIntervalSeries(
                getRaster() != null ? getRaster().getName() : DEFAULT_SAMPLE_DATASET_NAME);
        for (int x = 0; x < sampleValues.length; x++) {
            final float y = sampleValues[x];
            final float dy = sampleSigmas[x];
            series.add(x, x - dx, x + dx, y, y - dy, y + dy);
        }
        dataset.addSeries(series);

        if (dataSourceConfig.useCorrelativeData && dataSourceConfig.pointDataSource != null
                && dataSourceConfig.dataField != null) {

            XYIntervalSeries corrSeries = new XYIntervalSeries(
                    getCorrelativeDataLabel(dataSourceConfig.pointDataSource, dataSourceConfig.dataField));
            int[] shapeVertexIndexes = profileData.getShapeVertexIndexes();
            SimpleFeature[] simpleFeatures = dataSourceConfig.pointDataSource.getFeatureCollection()
                    .toArray(new SimpleFeature[0]);

            if (shapeVertexIndexes.length == simpleFeatures.length) {
                int fieldIndex = getAttributeIndex(dataSourceConfig.pointDataSource,
                        dataSourceConfig.dataField);
                if (fieldIndex != -1) {
                    for (int i = 0; i < simpleFeatures.length; i++) {
                        Number attribute = (Number) simpleFeatures[i].getAttribute(fieldIndex);
                        if (attribute != null) {
                            final double x = shapeVertexIndexes[i];
                            final double y = attribute.doubleValue();
                            corrSeries.add(x, x, x, y, y, y);
                        }
                    }
                    dataset.addSeries(corrSeries);
                }
            } else {
                System.out.println("Weird things happened:");
                System.out.println("  shapeVertexIndexes.length = " + shapeVertexIndexes.length);
                System.out.println("  simpleFeatures.length     = " + simpleFeatures.length);
            }

        }

        profilePlotDisplay.restoreAutoBounds();
        xAxisRangeControl.getBindingContext().setComponentsEnabled(PROPERTY_NAME_MARK_SEGMENTS,
                profileData.getShapeVertices().length > 2);
    }
}

From source file:weka.gui.beans.JFreeChartOffscreenChartRenderer.java

/**
 * Render an XY scatter plot/*from w  ww  .jav  a  2  s.  c o m*/
 * 
 * @param width the width of the resulting chart in pixels
 * @param height the height of the resulting chart in pixels
 * @param series a list of Instances - one for each series to be plotted
 * @param xAxis the name of the attribute for the x-axis (all series Instances
 *          are expected to have an attribute of the same type with this name)
 * @param yAxis the name of the attribute for the y-axis (all series Instances
 *          are expected to have an attribute of the same type with this name)
 * @param optionalArgs optional arguments to the renderer (may be null)
 * 
 * @return a BufferedImage containing the chart
 * @throws Exception if there is a problem rendering the chart
 */
public BufferedImage renderXYScatterPlot(int width, int height, List<Instances> series, String xAxis,
        String yAxis, List<String> optionalArgs) throws Exception {

    String plotTitle = "Scatter Plot";
    String userTitle = getOption(optionalArgs, "-title");
    plotTitle = (userTitle != null) ? userTitle : plotTitle;
    String colorAtt = getOption(optionalArgs, "-color");

    if (series.size() == 1 && colorAtt != null && colorAtt.length() > 0) {
        int colIndex = getIndexOfAttribute(series.get(0), colorAtt);
        if (colIndex >= 0 && series.get(0).attribute(colIndex).isNominal()) {
            // split single series out into multiple instances objects - one
            // per class
            series = splitToClasses(series.get(0), colIndex);
            for (Instances insts : series) {
                insts.setClassIndex(colIndex);
            }
        }
    }

    Instances masterInstances = series.get(0);
    int xAx = getIndexOfAttribute(masterInstances, xAxis);
    int yAx = getIndexOfAttribute(masterInstances, yAxis);
    if (xAx < 0) {
        xAx = 0;
    }
    if (yAx < 0) {
        yAx = 0;
    }

    // Set the axis names just in case we've been supplied with
    // /first, /last or /<num>
    xAxis = masterInstances.attribute(xAx).name();
    yAxis = masterInstances.attribute(yAx).name();

    // look for an additional attribute that stores the
    // shape sizes - could be either nominal or numeric errors.
    // We only use numeric error information
    String shapeSize = getOption(optionalArgs, "-shapeSize");

    boolean nominalClass = (masterInstances.classIndex() >= 0 && masterInstances.classAttribute().isNominal());

    int shapeSizeI = -1;
    if (shapeSize != null && shapeSize.length() > 0) {
        shapeSizeI = getIndexOfAttribute(masterInstances, shapeSize);
    }

    AbstractIntervalXYDataset xyDataset = null;

    if (shapeSizeI < 0 || nominalClass) {
        xyDataset = new XYSeriesCollection();
    } else {
        xyDataset = new XYIntervalSeriesCollection();
    }
    // add master series
    Series master = null;

    if (shapeSizeI < 0 || nominalClass) {
        master = new XYSeries(masterInstances.relationName());
    } else {
        master = new XYIntervalSeries(masterInstances.relationName());
    }
    AttributeStats xStats = masterInstances.attributeStats(xAx);
    AttributeStats yStats = masterInstances.attributeStats(yAx);
    double sizeRange = 0;
    double sizeMin = 0;
    if (shapeSizeI >= 0 && !nominalClass) {
        AttributeStats sStats = masterInstances.attributeStats(shapeSizeI);
        sizeRange = sStats.numericStats.max - sStats.numericStats.min;
        sizeMin = sStats.numericStats.min;
    }
    double xRange = 0;
    if (masterInstances.attribute(xAx).isNominal()) {
        xRange = masterInstances.attribute(xAx).numValues();
    } else {
        xRange = xStats.numericStats.max - xStats.numericStats.min;
    }
    double yRange = 0;
    if (masterInstances.attribute(yAx).isNominal()) {
        xRange = masterInstances.attribute(yAx).numValues();
    } else {
        yRange = yStats.numericStats.max - yStats.numericStats.min;
    }
    for (int i = 0; i < masterInstances.numInstances(); i++) {
        Instance inst = masterInstances.instance(i);
        if (!inst.isMissing(xAx) && !inst.isMissing(yAx)) {
            if (shapeSizeI < 0 || nominalClass) {
                ((XYSeries) master).add(inst.value(xAx), inst.value(yAx));
            } else {
                double xBar = (inst.value(shapeSizeI) - sizeMin) / sizeRange;
                xBar *= (xRange / 5.0); // max of 1/5th the x range
                double yBar = (inst.value(shapeSizeI) - sizeMin) / sizeRange;
                yBar *= (yRange / 5.0);
                double x = inst.value(xAx);
                double y = inst.value(yAx);
                ((XYIntervalSeries) master).add(x, x - (xBar / 2.0), x + (xBar / 2.0), y, y - (yBar / 2.0),
                        y + (yBar / 2.0));
            }
        }
    }

    if (shapeSizeI < 0 || nominalClass) {
        ((XYSeriesCollection) xyDataset).addSeries((XYSeries) master);
    } else {
        ((XYIntervalSeriesCollection) xyDataset).addSeries((XYIntervalSeries) master);
    }

    // remaining series
    for (int i = 1; i < series.size(); i++) {
        Instances aSeriesI = series.get(i);
        Series aSeriesJ = null;
        if (shapeSizeI < 0 || nominalClass) {
            aSeriesJ = new XYSeries(aSeriesI.relationName());
        } else {
            aSeriesJ = new XYIntervalSeries(aSeriesI.relationName());
        }
        for (int j = 0; j < aSeriesI.numInstances(); j++) {
            Instance inst = aSeriesI.instance(j);
            if (!inst.isMissing(xAx) && !inst.isMissing(yAx)) {
                if (shapeSizeI < 0 || nominalClass) {
                    ((XYSeries) aSeriesJ).add(inst.value(xAx), inst.value(yAx));
                } else {
                    double xBar = (inst.value(shapeSizeI) - sizeMin) / sizeRange;
                    xBar *= (xRange / 5.0); // max of 1/10th the x range
                    double yBar = (inst.value(shapeSizeI) - sizeMin) / sizeRange;
                    yBar *= (yRange / 5.0);
                    double x = inst.value(xAx);
                    double y = inst.value(yAx);
                    ((XYIntervalSeries) aSeriesJ).add(x, x - (xBar / 2.0), x + (xBar / 2.0), y,
                            y - (yBar / 2.0), y + (yBar / 2.0));
                }
            }
        }

        if (shapeSizeI < 0 || nominalClass) {
            ((XYSeriesCollection) xyDataset).addSeries((XYSeries) aSeriesJ);
        } else {
            ((XYIntervalSeriesCollection) xyDataset).addSeries((XYIntervalSeries) aSeriesJ);
        }
    }

    JFreeChart chart = ChartFactory.createXYLineChart(plotTitle, xAxis, yAxis, xyDataset,
            PlotOrientation.VERTICAL, true, false, false);
    chart.setBackgroundPaint(java.awt.Color.white);
    XYPlot plot = (XYPlot) chart.getPlot();
    if (shapeSizeI < 0 || nominalClass) {
        XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer(false, true);
        renderer.setBaseShapesFilled(false);
        plot.setRenderer(renderer);
    } else {
        XYErrorRenderer renderer = new XYErrorRenderer();
        renderer.setDrawXError(true);
        renderer.setDrawYError(true);
        renderer.setBaseLinesVisible(false);
        plot.setRenderer(renderer);
    }

    BufferedImage image = chart.createBufferedImage(width, height);

    return image;
}

From source file:jhplot.HChart.java

/**
 * Add a H1D histogram to the chart. Call update() method to view it.
 * //from   ww w.  j a  v  a2 s  . co  m
 * @param h1
 *            H1D histogram
 */
public void add(H1D h1) {

    IAxis axis = h1.get().axis();

    XYIntervalSeriesCollection c = new XYIntervalSeriesCollection();
    XYIntervalSeries SerData = new XYIntervalSeries(h1.getTitle());
    int ibins = axis.bins();
    for (int i = 0; i < ibins; i++) {
        SerData.add(h1.binMean(i), axis.binLowerEdge(i), axis.binUpperEdge(i), h1.binHeight(i), 0,
                h1.binHeight(i));

    }
    c.addSeries(SerData);
    xyplot[N1][N2].setDataset(indexdat[N1][N2], c);

    XYBarRenderer render = new XYBarRenderer();
    LinePars lpp = h1.getDrawOption();
    Color cfill = lpp.getFillColor();
    float width = (float) lpp.getPenWidth();
    int style = h1.getLineStyle();
    float dash = lpp.getDashLength();
    StandardXYBarPainter paint = new StandardXYBarPainter();
    render.setBarPainter(paint);
    render.setDrawBarOutline(true);
    render.setShadowVisible(false);
    render.setBaseStroke(getStrokes(style, width, dash));
    render.setBasePaint(cfill);
    render.setBaseOutlinePaint(h1.getColor());
    render.setBaseOutlineStroke(getStrokes(style, width, dash));
    render.setSeriesStroke(0, getStrokes(style, width, dash));
    render.setSeriesPaint(0, cfill);
    render.setSeriesOutlinePaint(0, h1.getColor());
    if (h1.isFilled()) {
        render.setSeriesFillPaint(0, cfill);
    }

    // System.out.println(render.toString());
    // System.out.println(rdat[N1][N2]);
    rdat[N1][N2].add(render);
    type[N1][N2].put(new Integer(indexdat[N1][N2]), "h");
    indexdat[N1][N2]++;

}

From source file:jhplot.HChart.java

/**
 * Draw data from a P1D. Drawing updated automatically. 1st level errors are
 * shown if the dimension is above 5. Otherwise show X and Y. If you set
 * setChartPolar() before,m you can also show polar coordinates.
 * /*from   w ww .ja v a2s .  c  om*/
 * @param d
 *            input P1D container
 */
public void add(P1D d) {

    if (cdatPolar[N1][N2] != null) {
        XYSeries SerData = new XYSeries(d.getTitle());
        for (int i = 0; i < d.size(); i++)
            SerData.add(d.getX(i), d.getY(i));
        cdatPolar[N1][N2].addSeries(SerData);
        return; // return if this is polar chart
    }

    // assume XY chart

    // System.out.println(d.dimension());
    LinePars lpp = d.getDrawOption();
    float width = (float) lpp.getPenWidth();
    int style = d.getLineStyle();
    float dash = lpp.getDashLength();
    int symbol = lpp.getSymbol();
    Shape shape = getShape(symbol, lpp.getSymbolSize());

    // setSeriesShapesFilled(int series, java.lang.Boolean flag)
    // setShapesFilled(boolean filled)

    if (d.dimension() > 5) {
        XYIntervalSeriesCollection c = new XYIntervalSeriesCollection();
        XYIntervalSeries SerData = new XYIntervalSeries(d.getTitle());
        for (int i = 0; i < d.size(); i++)
            SerData.add(d.getX(i), d.getX(i) - d.getXleft(i), d.getX(i) + d.getXright(i), d.getY(i),
                    d.getY(i) - d.getYlower(i), d.getY(i) + d.getYupper(i));
        c.addSeries(SerData);
        xyplot[N1][N2].setDataset(indexdat[N1][N2], c);

        XYErrorRenderer xyerrorrenderer = new XYErrorRenderer();
        xyerrorrenderer.setSeriesStroke(0, getStrokes(style, width, dash));
        xyerrorrenderer.setSeriesPaint(0, d.getColor());
        xyerrorrenderer.setSeriesOutlinePaint(0, d.getColor());
        xyerrorrenderer.setSeriesFillPaint(0, lpp.getFillColor());
        xyerrorrenderer.setSeriesShape(0, shape);
        if (symbol > 0 && symbol < 4)
            xyerrorrenderer.setSeriesShapesFilled(0, false);
        if (symbol > 3)
            xyerrorrenderer.setSeriesShapesFilled(0, true);

        rdat[N1][N2].add(xyerrorrenderer);
        type[N1][N2].put(new Integer(indexdat[N1][N2]), "pe");
        indexdat[N1][N2]++;

    } else if (d.dimension() == 4) {
        XYIntervalSeriesCollection c = new XYIntervalSeriesCollection();
        XYIntervalSeries SerData = new XYIntervalSeries(d.getTitle());
        for (int i = 0; i < d.size(); i++)
            SerData.add(d.getX(i), d.getX(i), d.getX(i), d.getY(i), d.getY(i) - d.getYlower(i),
                    d.getY(i) + d.getYupper(i));

        c.addSeries(SerData);
        xyplot[N1][N2].setDataset(indexdat[N1][N2], c);

        XYErrorRenderer xyerrorrenderer = new XYErrorRenderer();
        xyerrorrenderer.setSeriesStroke(0, getStrokes(style, width, dash));
        xyerrorrenderer.setSeriesPaint(0, d.getColor());
        xyerrorrenderer.setSeriesOutlinePaint(0, d.getColor());
        xyerrorrenderer.setSeriesFillPaint(0, lpp.getFillColor());
        xyerrorrenderer.setSeriesShape(0, shape);
        if (symbol > 0 && symbol < 4)
            xyerrorrenderer.setSeriesShapesFilled(0, false);
        if (symbol > 3)
            xyerrorrenderer.setSeriesShapesFilled(0, true);

        rdat[N1][N2].add(xyerrorrenderer);
        type[N1][N2].put(new Integer(indexdat[N1][N2]), "pe");
        indexdat[N1][N2]++;

    } else if (d.dimension() == 3) {
        XYIntervalSeriesCollection c = new XYIntervalSeriesCollection();
        XYIntervalSeries SerData = new XYIntervalSeries(d.getTitle());
        for (int i = 0; i < d.size(); i++)
            SerData.add(d.getX(i), d.getX(i), d.getX(i), d.getY(i), d.getY(i) - d.getYupper(i),
                    d.getY(i) + d.getYupper(i));

        c.addSeries(SerData);
        xyplot[N1][N2].setDataset(indexdat[N1][N2], c);

        XYErrorRenderer xyerrorrenderer = new XYErrorRenderer();
        xyerrorrenderer.setSeriesStroke(0, getStrokes(style, width, dash));
        xyerrorrenderer.setSeriesPaint(0, d.getColor());
        xyerrorrenderer.setSeriesOutlinePaint(0, d.getColor());
        xyerrorrenderer.setSeriesFillPaint(0, lpp.getFillColor());
        xyerrorrenderer.setSeriesShape(0, shape);
        if (symbol > 0 && symbol < 4)
            xyerrorrenderer.setSeriesShapesFilled(0, false);
        if (symbol > 3)
            xyerrorrenderer.setSeriesShapesFilled(0, true);

        rdat[N1][N2].add(xyerrorrenderer);
        type[N1][N2].put(new Integer(indexdat[N1][N2]), "pe");
        indexdat[N1][N2]++;

    } else {
        XYSeriesCollection c = new XYSeriesCollection();
        XYSeries SerData = new XYSeries(d.getTitle());
        for (int i = 0; i < d.size(); i++)
            SerData.add(d.getX(i), d.getY(i));
        c.addSeries(SerData);
        xyplot[N1][N2].setDataset(indexdat[N1][N2], c);

        XYLineAndShapeRenderer xyerrorrenderer = new XYLineAndShapeRenderer(false, true);
        xyerrorrenderer.setSeriesStroke(0, getStrokes(style, width, dash));
        xyerrorrenderer.setSeriesPaint(0, d.getColor());
        xyerrorrenderer.setSeriesOutlinePaint(0, d.getColor());

        xyerrorrenderer.setSeriesFillPaint(0, lpp.getFillColor());
        xyerrorrenderer.setSeriesShape(0, shape);
        if (symbol > 0 && symbol < 4)
            xyerrorrenderer.setSeriesShapesFilled(0, false);
        if (symbol > 3)
            xyerrorrenderer.setSeriesShapesFilled(0, true);

        rdat[N1][N2].add(xyerrorrenderer);
        type[N1][N2].put(new Integer(indexdat[N1][N2]), "p");
        indexdat[N1][N2]++;

    }

}

From source file:org.esa.snap.rcp.statistics.ScatterPlotPanel.java

private void compute(final Mask selectedMask) {

    final RasterDataNode raster = getRaster();

    final AttributeDescriptor dataField = scatterPlotModel.dataField;
    if (raster == null || dataField == null) {
        return;/*from  ww w  .j a v  a2s .co  m*/
    }

    SwingWorker<ComputedData[], Object> swingWorker = new SwingWorker<ComputedData[], Object>() {

        @Override
        protected ComputedData[] doInBackground() throws Exception {
            SystemUtils.LOG.finest("start computing scatter plot data");

            final List<ComputedData> computedDataList = new ArrayList<>();

            final FeatureCollection<SimpleFeatureType, SimpleFeature> collection = scatterPlotModel.pointDataSource
                    .getFeatureCollection();
            final SimpleFeature[] features = collection.toArray(new SimpleFeature[collection.size()]);

            final int boxSize = scatterPlotModel.boxSize;

            final Rectangle sceneRect = new Rectangle(raster.getRasterWidth(), raster.getRasterHeight());

            final GeoCoding geoCoding = raster.getGeoCoding();
            final AffineTransform imageToModelTransform;
            imageToModelTransform = Product.findImageToModelTransform(geoCoding);
            for (SimpleFeature feature : features) {
                final Point point = (Point) feature.getDefaultGeometryProperty().getValue();
                Point2D modelPos = new Point2D.Float((float) point.getX(), (float) point.getY());
                final Point2D imagePos = imageToModelTransform.inverseTransform(modelPos, null);

                if (!sceneRect.contains(imagePos)) {
                    continue;
                }
                final float imagePosX = (float) imagePos.getX();
                final float imagePosY = (float) imagePos.getY();
                final Rectangle imageRect = sceneRect.intersection(new Rectangle(
                        ((int) imagePosX) - boxSize / 2, ((int) imagePosY) - boxSize / 2, boxSize, boxSize));
                if (imageRect.isEmpty()) {
                    continue;
                }
                final double[] rasterValues = new double[imageRect.width * imageRect.height];
                raster.readPixels(imageRect.x, imageRect.y, imageRect.width, imageRect.height, rasterValues);

                final int[] maskBuffer = new int[imageRect.width * imageRect.height];
                Arrays.fill(maskBuffer, 1);
                if (selectedMask != null) {
                    selectedMask.readPixels(imageRect.x, imageRect.y, imageRect.width, imageRect.height,
                            maskBuffer);
                }

                final int centerIndex = imageRect.width * (imageRect.height / 2) + (imageRect.width / 2);
                if (maskBuffer[centerIndex] == 0) {
                    continue;
                }

                double sum = 0;
                double sumSqr = 0;
                int n = 0;
                boolean valid = false;

                for (int y = 0; y < imageRect.height; y++) {
                    for (int x = 0; x < imageRect.width; x++) {
                        final int index = y * imageRect.height + x;
                        if (raster.isPixelValid(x + imageRect.x, y + imageRect.y) && maskBuffer[index] != 0) {
                            final double rasterValue = rasterValues[index];
                            sum += rasterValue;
                            sumSqr += rasterValue * rasterValue;
                            n++;
                            valid = true;
                        }
                    }
                }

                if (!valid) {
                    continue;
                }

                double rasterMean = sum / n;
                double rasterSigma = n > 1 ? Math.sqrt((sumSqr - (sum * sum) / n) / (n - 1)) : 0.0;

                String localName = dataField.getLocalName();
                Number attribute = (Number) feature.getAttribute(localName);

                final Collection<org.opengis.feature.Property> featureProperties = feature.getProperties();

                final float correlativeData = attribute.floatValue();
                final GeoPos geoPos = new GeoPos();
                if (geoCoding.canGetGeoPos()) {
                    final PixelPos pixelPos = new PixelPos(imagePosX, imagePosY);
                    geoCoding.getGeoPos(pixelPos, geoPos);
                } else {
                    geoPos.setInvalid();
                }
                computedDataList.add(
                        new ComputedData(imagePosX, imagePosY, (float) geoPos.getLat(), (float) geoPos.getLon(),
                                (float) rasterMean, (float) rasterSigma, correlativeData, featureProperties));
            }

            return computedDataList.toArray(new ComputedData[computedDataList.size()]);
        }

        @Override
        public void done() {
            try {
                final ValueAxis xAxis = getPlot().getDomainAxis();
                final ValueAxis yAxis = getPlot().getRangeAxis();

                xAxis.setAutoRange(false);
                yAxis.setAutoRange(false);

                scatterpointsDataset.removeAllSeries();
                acceptableDeviationDataset.removeAllSeries();
                regressionDataset.removeAllSeries();
                getPlot().removeAnnotation(r2Annotation);
                computedDatas = null;

                final ComputedData[] data = get();
                if (data.length == 0) {
                    return;
                }

                computedDatas = data;

                final XYIntervalSeries scatterValues = new XYIntervalSeries(getCorrelativeDataName());
                for (ComputedData computedData : computedDatas) {
                    final float rasterMean = computedData.rasterMean;
                    final float rasterSigma = computedData.rasterSigma;
                    final float correlativeData = computedData.correlativeData;
                    scatterValues.add(correlativeData, correlativeData, correlativeData, rasterMean,
                            rasterMean - rasterSigma, rasterMean + rasterSigma);
                }

                computingData = true;
                scatterpointsDataset.addSeries(scatterValues);

                xAxis.setAutoRange(true);
                yAxis.setAutoRange(true);

                xAxis.setAutoRange(false);
                yAxis.setAutoRange(false);

                xAutoRangeAxisRange = new Range(xAxis.getLowerBound(), xAxis.getUpperBound());
                yAutoRangeAxisRange = new Range(yAxis.getLowerBound(), yAxis.getUpperBound());

                if (xAxisRangeControl.isAutoMinMax()) {
                    xAxisRangeControl.adjustComponents(xAxis, 3);
                } else {
                    xAxisRangeControl.adjustAxis(xAxis, 3);
                }
                if (yAxisRangeControl.isAutoMinMax()) {
                    yAxisRangeControl.adjustComponents(yAxis, 3);
                } else {
                    yAxisRangeControl.adjustAxis(yAxis, 3);
                }

                computeRegressionAndAcceptableDeviationData();
                computingData = false;
            } catch (InterruptedException | CancellationException e) {
                SystemUtils.LOG.log(Level.WARNING, "Failed to compute correlative plot.", e);
                Dialogs.showMessage(CHART_TITLE,
                        "Failed to compute correlative plot.\n" + "Calculation canceled.",
                        JOptionPane.ERROR_MESSAGE, null);
            } catch (ExecutionException e) {
                SystemUtils.LOG.log(Level.WARNING, "Failed to compute correlative plot.", e);
                Dialogs.showMessage(CHART_TITLE, "Failed to compute correlative plot.\n"
                        + "An error occurred:\n" + e.getCause().getMessage(), JOptionPane.ERROR_MESSAGE, null);
            }
        }
    };
    swingWorker.execute();
}

From source file:org.esa.beam.visat.toolviews.stat.ScatterPlotPanel.java

private void compute(final Mask selectedMask) {

    final RasterDataNode raster = getRaster();

    final AttributeDescriptor dataField = scatterPlotModel.dataField;
    if (raster == null || dataField == null) {
        return;//  w w w.  j  ava2 s  . c  o  m
    }

    SwingWorker<ComputedData[], Object> swingWorker = new SwingWorker<ComputedData[], Object>() {

        @Override
        protected ComputedData[] doInBackground() throws Exception {
            BeamLogManager.getSystemLogger().finest("start computing scatter plot data");

            final List<ComputedData> computedDataList = new ArrayList<>();

            final FeatureCollection<SimpleFeatureType, SimpleFeature> collection = scatterPlotModel.pointDataSource
                    .getFeatureCollection();
            final SimpleFeature[] features = collection.toArray(new SimpleFeature[collection.size()]);

            final int boxSize = scatterPlotModel.boxSize;

            final Rectangle sceneRect = new Rectangle(raster.getSceneRasterWidth(),
                    raster.getSceneRasterHeight());

            final GeoCoding geoCoding = raster.getGeoCoding();
            final AffineTransform imageToModelTransform;
            imageToModelTransform = ImageManager.getImageToModelTransform(geoCoding);
            for (SimpleFeature feature : features) {
                final Point point = (Point) feature.getDefaultGeometryProperty().getValue();
                Point2D modelPos = new Point2D.Float((float) point.getX(), (float) point.getY());
                final Point2D imagePos = imageToModelTransform.inverseTransform(modelPos, null);

                if (!sceneRect.contains(imagePos)) {
                    continue;
                }
                final float imagePosX = (float) imagePos.getX();
                final float imagePosY = (float) imagePos.getY();
                final Rectangle imageRect = sceneRect.intersection(new Rectangle(
                        ((int) imagePosX) - boxSize / 2, ((int) imagePosY) - boxSize / 2, boxSize, boxSize));
                if (imageRect.isEmpty()) {
                    continue;
                }
                final double[] rasterValues = new double[imageRect.width * imageRect.height];
                raster.readPixels(imageRect.x, imageRect.y, imageRect.width, imageRect.height, rasterValues);

                final int[] maskBuffer = new int[imageRect.width * imageRect.height];
                Arrays.fill(maskBuffer, 1);
                if (selectedMask != null) {
                    selectedMask.readPixels(imageRect.x, imageRect.y, imageRect.width, imageRect.height,
                            maskBuffer);
                }

                final int centerIndex = imageRect.width * (imageRect.height / 2) + (imageRect.width / 2);
                if (maskBuffer[centerIndex] == 0) {
                    continue;
                }

                double sum = 0;
                double sumSqr = 0;
                int n = 0;
                boolean valid = false;

                for (int y = 0; y < imageRect.height; y++) {
                    for (int x = 0; x < imageRect.width; x++) {
                        final int index = y * imageRect.height + x;
                        if (raster.isPixelValid(x + imageRect.x, y + imageRect.y) && maskBuffer[index] != 0) {
                            final double rasterValue = rasterValues[index];
                            sum += rasterValue;
                            sumSqr += rasterValue * rasterValue;
                            n++;
                            valid = true;
                        }
                    }
                }

                if (!valid) {
                    continue;
                }

                double rasterMean = sum / n;
                double rasterSigma = n > 1 ? Math.sqrt((sumSqr - (sum * sum) / n) / (n - 1)) : 0.0;

                String localName = dataField.getLocalName();
                Number attribute = (Number) feature.getAttribute(localName);

                final Collection<org.opengis.feature.Property> featureProperties = feature.getProperties();

                final float correlativeData = attribute.floatValue();
                final GeoPos geoPos = new GeoPos();
                if (geoCoding.canGetGeoPos()) {
                    final PixelPos pixelPos = new PixelPos(imagePosX, imagePosY);
                    geoCoding.getGeoPos(pixelPos, geoPos);
                } else {
                    geoPos.setInvalid();
                }
                computedDataList.add(new ComputedData(imagePosX, imagePosY, geoPos.getLat(), geoPos.getLon(),
                        (float) rasterMean, (float) rasterSigma, correlativeData, featureProperties));
            }

            return computedDataList.toArray(new ComputedData[computedDataList.size()]);
        }

        @Override
        public void done() {
            try {
                final ValueAxis xAxis = getPlot().getDomainAxis();
                final ValueAxis yAxis = getPlot().getRangeAxis();

                xAxis.setAutoRange(false);
                yAxis.setAutoRange(false);

                scatterpointsDataset.removeAllSeries();
                acceptableDeviationDataset.removeAllSeries();
                regressionDataset.removeAllSeries();
                getPlot().removeAnnotation(r2Annotation);
                computedDatas = null;

                final ComputedData[] data = get();
                if (data.length == 0) {
                    return;
                }

                computedDatas = data;

                final XYIntervalSeries scatterValues = new XYIntervalSeries(getCorrelativeDataName());
                for (ComputedData computedData : computedDatas) {
                    final float rasterMean = computedData.rasterMean;
                    final float rasterSigma = computedData.rasterSigma;
                    final float correlativeData = computedData.correlativeData;
                    scatterValues.add(correlativeData, correlativeData, correlativeData, rasterMean,
                            rasterMean - rasterSigma, rasterMean + rasterSigma);
                }

                computingData = true;
                scatterpointsDataset.addSeries(scatterValues);

                xAxis.setAutoRange(true);
                yAxis.setAutoRange(true);

                xAxis.setAutoRange(false);
                yAxis.setAutoRange(false);

                xAutoRangeAxisRange = new Range(xAxis.getLowerBound(), xAxis.getUpperBound());
                yAutoRangeAxisRange = new Range(yAxis.getLowerBound(), yAxis.getUpperBound());

                if (xAxisRangeControl.isAutoMinMax()) {
                    xAxisRangeControl.adjustComponents(xAxis, 3);
                } else {
                    xAxisRangeControl.adjustAxis(xAxis, 3);
                }
                if (yAxisRangeControl.isAutoMinMax()) {
                    yAxisRangeControl.adjustComponents(yAxis, 3);
                } else {
                    yAxisRangeControl.adjustAxis(yAxis, 3);
                }

                computeRegressionAndAcceptableDeviationData();
                computingData = false;
            } catch (InterruptedException | CancellationException e) {
                BeamLogManager.getSystemLogger().log(Level.WARNING, "Failed to compute correlative plot.", e);
                JOptionPane.showMessageDialog(getParentDialogContentPane(),
                        "Failed to compute correlative plot.\n" + "Calculation canceled.",
                        /*I18N*/
                        CHART_TITLE, /*I18N*/
                        JOptionPane.ERROR_MESSAGE);
            } catch (ExecutionException e) {
                BeamLogManager.getSystemLogger().log(Level.WARNING, "Failed to compute correlative plot.", e);
                JOptionPane.showMessageDialog(getParentDialogContentPane(),
                        "Failed to compute correlative plot.\n" + "An error occurred:\n"
                                + e.getCause().getMessage(),
                        CHART_TITLE, /*I18N*/
                        JOptionPane.ERROR_MESSAGE);
            }
        }
    };
    swingWorker.execute();
}

From source file:org.esa.snap.rcp.statistics.ScatterPlotPanel.java

private XYIntervalSeries computeRegressionData(double xStart, double xEnd) {
    if (scatterpointsDataset.getItemCount(0) > 1) {
        final double[] coefficients = Regression.getOLSRegression(scatterpointsDataset, 0);
        final Function2D curve = new LineFunction2D(coefficients[0], coefficients[1]);
        final XYSeries regressionData = DatasetUtilities.sampleFunction2DToSeries(curve, xStart, xEnd, 100,
                "regression line");
        final XYIntervalSeries xyIntervalRegression = new XYIntervalSeries(regressionData.getKey());
        for (int i = 0; i < regressionData.getItemCount(); i++) {
            XYDataItem item = regressionData.getDataItem(i);
            final double x = item.getXValue();
            final double y = item.getYValue();
            xyIntervalRegression.add(x, x, x, y, y, y);
        }/*from  w w  w.  j  a v a 2  s.c o m*/
        return xyIntervalRegression;
    } else {
        JOptionPane.showMessageDialog(this, "Unable to compute regression line.\n"
                + "At least 2 values are needed to compute regression coefficients.");
        return null;
    }
}

From source file:org.esa.beam.visat.toolviews.stat.ScatterPlotPanel.java

private XYIntervalSeries computeRegressionData(double xStart, double xEnd) {
    if (scatterpointsDataset.getItemCount(0) > 1) {
        final double[] coefficients = Regression.getOLSRegression(scatterpointsDataset, 0);
        final Function2D curve = new LineFunction2D(coefficients[0], coefficients[1]);
        final XYSeries regressionData = DatasetUtilities.sampleFunction2DToSeries(curve, xStart, xEnd, 100,
                "regression line");
        final XYIntervalSeries xyIntervalRegression = new XYIntervalSeries(regressionData.getKey());
        final List<XYDataItem> regressionDataItems = regressionData.getItems();
        for (XYDataItem item : regressionDataItems) {
            final double x = item.getXValue();
            final double y = item.getYValue();
            xyIntervalRegression.add(x, x, x, y, y, y);
        }/* w w w  . java  2 s .c o  m*/
        return xyIntervalRegression;
    } else {
        JOptionPane.showMessageDialog(this, "Unable to compute regression line.\n"
                + "At least 2 values are needed to compute regression coefficients.");
        return null;
    }
}

From source file:org.esa.snap.rcp.statistics.ScatterPlotPanel.java

private XYIntervalSeries computeAcceptableDeviationData(double lowerBound, double upperBound) {
    final XYSeries identity = DatasetUtilities.sampleFunction2DToSeries(x -> x, lowerBound, upperBound, 100,
            "1:1 line");
    final XYIntervalSeries xyIntervalSeries = new XYIntervalSeries(identity.getKey());
    for (int i = 0; i < identity.getItemCount(); i++) {
        XYDataItem item = identity.getDataItem(i);
        final double x = item.getXValue();
        final double y = item.getYValue();
        if (scatterPlotModel.showAcceptableDeviation) {
            final double acceptableDeviation = scatterPlotModel.acceptableDeviationInterval;
            final double xOff = acceptableDeviation * x / 100;
            final double yOff = acceptableDeviation * y / 100;
            xyIntervalSeries.add(x, x - xOff, x + xOff, y, y - yOff, y + yOff);
        } else {//w w  w. j av  a 2s. c o m
            xyIntervalSeries.add(x, x, x, y, y, y);
        }
    }
    return xyIntervalSeries;
}