Search in sources :

Example 11 with ValueMarker

use of org.jfree.chart.plot.ValueMarker in project ma-core-public by infiniteautomation.

the class ImageChartUtils method writeChart.

public static void writeChart(PointTimeSeriesCollection pointTimeSeriesCollection, boolean showLegend, OutputStream out, int width, int height, long from, long to) throws IOException {
    JFreeChart chart = ChartFactory.createTimeSeriesChart(null, null, null, null, showLegend, false, false);
    chart.setBackgroundPaint(SystemSettingsDao.getColour(SystemSettingsDao.CHART_BACKGROUND_COLOUR));
    XYPlot plot = chart.getXYPlot();
    ((DateAxis) plot.getDomainAxis()).setTimeZone(pointTimeSeriesCollection.getTimeZone());
    plot.setBackgroundPaint(SystemSettingsDao.getColour(SystemSettingsDao.PLOT_BACKGROUND_COLOUR));
    Color gridlines = SystemSettingsDao.getColour(SystemSettingsDao.PLOT_GRIDLINE_COLOUR);
    plot.setDomainGridlinePaint(gridlines);
    plot.setRangeGridlinePaint(gridlines);
    ((NumberAxis) plot.getRangeAxis()).setAutoRangeStickyZero(false);
    double numericMin = 0;
    double numericMax = 1;
    int numericSeriesCount = pointTimeSeriesCollection.getNumericSeriesCount();
    if (pointTimeSeriesCollection.hasNumericData()) {
        for (int i = 0; i < numericSeriesCount; i++) {
            NumericTimeSeries nts = pointTimeSeriesCollection.getNumericTimeSeries(i);
            AbstractXYItemRenderer renderer;
            if (nts.getPlotType() == DataPointVO.PlotTypes.STEP)
                renderer = new XYStepRenderer();
            else if (nts.getPlotType() == DataPointVO.PlotTypes.LINE)
                renderer = new XYLineAndShapeRenderer(true, false);
            else {
                // XYCardinalSplineRenderer spline = new XYCardinalSplineRenderer(.5d, 16);
                // XYSmoothLineAndShapeRenderer spline = new XYSmoothLineAndShapeRenderer();
                // XYSplineRenderer spline = new XYSplineRenderer();
                // spline.setBaseShapesVisible(false);
                // renderer = spline;
                renderer = new XYLineAndShapeRenderer(true, false);
            }
            if (nts.getPaint() != null)
                renderer.setSeriesPaint(0, nts.getPaint(), false);
            if (nts.getStroke() != null)
                renderer.setSeriesStroke(0, nts.getStroke(), false);
            plot.setDataset(i, new TimeSeriesCollection(nts.getTimeSeries()));
            plot.setRenderer(i, renderer);
        }
        numericMin = plot.getRangeAxis().getLowerBound();
        numericMax = plot.getRangeAxis().getUpperBound();
        if (!pointTimeSeriesCollection.hasMultiplePoints()) {
            // If this chart displays a single point, check if there should be a range description.
            TimeSeries timeSeries = pointTimeSeriesCollection.getNumericTimeSeries(0).getTimeSeries();
            String desc = timeSeries.getRangeDescription();
            if (!StringUtils.isBlank(desc)) {
                // Replace any HTML entities with Java equivalents
                desc = StripEntities.stripHTMLEntities(desc, ' ');
                plot.getRangeAxis().setLabel(desc);
            }
        }
    } else
        plot.getRangeAxis().setVisible(false);
    if (pointTimeSeriesCollection.getRangeMarkers() != null) {
        boolean rangeAdjusted = false;
        for (Marker marker : pointTimeSeriesCollection.getRangeMarkers()) {
            plot.addRangeMarker(marker);
            if (marker instanceof ValueMarker) {
                ValueMarker vm = (ValueMarker) marker;
                if (numericMin > vm.getValue()) {
                    numericMin = vm.getValue();
                    rangeAdjusted = true;
                }
                if (numericMax < vm.getValue()) {
                    numericMax = vm.getValue();
                    rangeAdjusted = true;
                }
            }
        }
        if (rangeAdjusted) {
            double adj = (numericMax - numericMin);
            plot.getRangeAxis().setLowerBound(numericMin - adj * plot.getRangeAxis().getLowerMargin());
            plot.getRangeAxis().setUpperBound(numericMax + adj * plot.getRangeAxis().getUpperMargin());
        }
    }
    int discreteValueCount = pointTimeSeriesCollection.getDiscreteValueCount();
    double interval = (numericMax - numericMin) / (discreteValueCount + 1);
    int intervalIndex = 1;
    if (pointTimeSeriesCollection.hasDiscreteData()) {
        for (int i = 0; i < pointTimeSeriesCollection.getDiscreteSeriesCount(); i++) {
            DiscreteTimeSeries dts = pointTimeSeriesCollection.getDiscreteTimeSeries(i);
            XYStepRenderer renderer = new XYStepRenderer();
            TimeSeries ts = new TimeSeries(dts.getName(), null, null);
            for (IValueTime vt : dts.getValueTimes()) addMillisecond(ts, vt.getTime(), numericMin + (interval * (dts.getValueIndex(vt.getValue()) + intervalIndex)));
            if (dts.getPaint() != null)
                renderer.setSeriesPaint(0, dts.getPaint(), false);
            if (dts.getStroke() != null)
                renderer.setSeriesStroke(0, dts.getStroke(), false);
            plot.setDataset(numericSeriesCount + i, new TimeSeriesCollection(ts, pointTimeSeriesCollection.getTimeZone()));
            plot.setRenderer(numericSeriesCount + i, renderer);
            intervalIndex += dts.getDiscreteValueCount();
        }
    }
    if (from > 0)
        plot.getDomainAxis().setLowerBound(from);
    if (to > 0)
        plot.getDomainAxis().setUpperBound(to);
    if (pointTimeSeriesCollection.hasDiscreteData()) {
        // Add the value annotations.
        double annoX = plot.getDomainAxis().getLowerBound();
        intervalIndex = 1;
        for (int i = 0; i < pointTimeSeriesCollection.getDiscreteSeriesCount(); i++) {
            DiscreteTimeSeries dts = pointTimeSeriesCollection.getDiscreteTimeSeries(i);
            for (int j = 0; j < dts.getDiscreteValueCount(); j++) {
                XYTextAnnotation anno = new XYTextAnnotation(" " + dts.getValueText(j), annoX, numericMin + (interval * (j + intervalIndex)));
                if (!pointTimeSeriesCollection.hasNumericData() && intervalIndex + j == discreteValueCount)
                    // This prevents the top label from getting cut off
                    anno.setTextAnchor(TextAnchor.TOP_LEFT);
                else
                    anno.setTextAnchor(TextAnchor.BOTTOM_LEFT);
                anno.setPaint(((AbstractRenderer) plot.getRenderer(numericSeriesCount + i)).lookupSeriesPaint(0));
                plot.addAnnotation(anno);
            }
            intervalIndex += dts.getDiscreteValueCount();
        }
    }
    // Return the image.
    ChartUtilities.writeChartAsPNG(out, chart, width, height);
}
Also used : DateAxis(org.jfree.chart.axis.DateAxis) NumberAxis(org.jfree.chart.axis.NumberAxis) TimeSeries(org.jfree.data.time.TimeSeries) Color(java.awt.Color) AbstractXYItemRenderer(org.jfree.chart.renderer.xy.AbstractXYItemRenderer) XYLineAndShapeRenderer(org.jfree.chart.renderer.xy.XYLineAndShapeRenderer) IValueTime(com.serotonin.m2m2.view.stats.IValueTime) ValueMarker(org.jfree.chart.plot.ValueMarker) Marker(org.jfree.chart.plot.Marker) JFreeChart(org.jfree.chart.JFreeChart) XYTextAnnotation(org.jfree.chart.annotations.XYTextAnnotation) XYPlot(org.jfree.chart.plot.XYPlot) TimeSeriesCollection(org.jfree.data.time.TimeSeriesCollection) XYStepRenderer(org.jfree.chart.renderer.xy.XYStepRenderer) ValueMarker(org.jfree.chart.plot.ValueMarker)

Example 12 with ValueMarker

use of org.jfree.chart.plot.ValueMarker in project ma-core-public by infiniteautomation.

the class ImageChartServlet method getImageData.

private byte[] getImageData(String imageInfo, HttpServletRequest request) throws IOException {
    // Hex colour definitions need to be prefixed with '0x' instead of '#'.
    try {
        // Remove the / and the .png
        imageInfo = imageInfo.substring(1, imageInfo.length() - 4);
        // Split by underscore.
        String[] imageBits = imageInfo.split("_");
        // Get the data.
        long from, to;
        int pointIdStart;
        if (imageBits[0].equals("ft")) {
            from = Long.parseLong(imageBits[2]);
            to = Long.parseLong(imageBits[3]);
            pointIdStart = 4;
        } else {
            from = Common.timer.currentTimeMillis() - Long.parseLong(imageBits[1]);
            to = -1;
            pointIdStart = 2;
        }
        int width = getIntRequestParameter(request, "w", 200);
        int height = getIntRequestParameter(request, "h", 100);
        String useCacheString = request.getParameter("useCache");
        boolean useCache = false;
        if (useCacheString != null && Boolean.valueOf(useCacheString))
            useCache = true;
        TimeZone timeZone = Common.getUserTimeZone(Common.getUser(request));
        // Create the datasets
        DataPointVO markerPoint = null;
        int pointCount = 0;
        PointTimeSeriesCollection ptsc = new PointTimeSeriesCollection(timeZone);
        for (int i = pointIdStart; i < imageBits.length; i++) {
            if (imageBits[i].startsWith("w"))
                width = NumberUtils.toInt(imageBits[i].substring(1), width);
            else if (imageBits[i].startsWith("h"))
                height = NumberUtils.toInt(imageBits[i].substring(1), height);
            else {
                String dataPointStr = imageBits[i];
                Color colour = null;
                int dataPointId;
                int pipe = dataPointStr.indexOf('|');
                if (pipe == -1)
                    dataPointId = Integer.parseInt(dataPointStr);
                else {
                    try {
                        String colourStr = dataPointStr.substring(pipe + 1);
                        if (colourStr.startsWith("0x"))
                            colourStr = "#" + colourStr.substring(2);
                        colour = ColorUtils.toColor(colourStr);
                    } catch (InvalidArgumentException e) {
                        throw new IOException(e);
                    }
                    dataPointId = Integer.parseInt(dataPointStr.substring(0, pipe));
                }
                // Get the data.
                DataPointVO dp = DataPointDao.instance.getDataPoint(dataPointId);
                if (dp != null && dp.getName() != null) {
                    pointCount++;
                    markerPoint = dp;
                    // Get the Color if there wasn't one provided
                    if (colour == null) {
                        try {
                            if (dp.getChartColour() != null)
                                colour = ColorUtils.toColor(dp.getChartColour());
                        } catch (InvalidArgumentException e) {
                        // Munch it
                        }
                    }
                    PointValueFacade pointValueFacade = new PointValueFacade(dataPointId, useCache);
                    List<PointValueTime> data;
                    if (from == -1 && to == -1)
                        data = pointValueFacade.getPointValuesBetween(0, Common.timer.currentTimeMillis(), true, true);
                    else if (from == -1)
                        data = pointValueFacade.getPointValuesBetween(0, to, true, true);
                    else if (to == -1)
                        data = pointValueFacade.getPointValuesBetween(from, Common.timer.currentTimeMillis(), true, true);
                    else
                        data = pointValueFacade.getPointValuesBetween(from, to, true, true);
                    if (dp.getPointLocator().getDataTypeId() == DataTypes.NUMERIC) {
                        TimeSeries ts;
                        if (dp.isUseRenderedUnit()) {
                            // This works because we enforce that all Units default to the ONE Unit if not used
                            UnitConverter converter = null;
                            if (dp.getRenderedUnit() != dp.getUnit())
                                converter = dp.getUnit().getConverterTo(dp.getRenderedUnit());
                            ts = new TimeSeries(dp.getExtendedName(), null, dp.getTextRenderer().getMetaText());
                            double value;
                            for (PointValueTime pv : data) {
                                if (pv.getValue() != null) {
                                    if (converter != null)
                                        value = converter.convert(pv.getDoubleValue());
                                    else
                                        value = pv.getDoubleValue();
                                    ImageChartUtils.addMillisecond(ts, pv.getTime(), value);
                                }
                            }
                        } else {
                            // No renderer, don't need it
                            ts = new TimeSeries(dp.getExtendedName(), null, dp.getTextRenderer().getMetaText());
                            for (PointValueTime pv : data) {
                                if (pv.getValue() != null)
                                    ImageChartUtils.addMillisecond(ts, pv.getTime(), pv.getValue().numberValue());
                            }
                        }
                        ptsc.addNumericTimeSeries(new NumericTimeSeries(dp.getPlotType(), ts, colour, null));
                    } else {
                        DiscreteTimeSeries ts = new DiscreteTimeSeries(dp.getExtendedName(), dp.getTextRenderer(), colour, null);
                        for (PointValueTime pv : data) if (pv.getValue() != null)
                            ts.addValueTime(pv);
                        ptsc.addDiscreteTimeSeries(ts);
                    }
                }
            }
        }
        if (pointCount == 1) {
            // Only one point. Check for limits to draw as markers.
            UnitConverter uc;
            if (markerPoint.getUnit() != null && markerPoint.getRenderedUnit() != null)
                uc = markerPoint.getUnit().getConverterTo(markerPoint.getRenderedUnit());
            else
                uc = Unit.ONE.getConverterTo(Unit.ONE);
            for (AbstractPointEventDetectorVO<?> ped : markerPoint.getEventDetectors()) {
                if (ped.getDefinition().getEventDetectorTypeName().equals(AnalogLowLimitEventDetectorDefinition.TYPE_NAME))
                    ptsc.addRangeMarker(new ValueMarker(uc.convert(((AnalogLowLimitDetectorVO) ped).getLimit()), lowLimitPaint, limitStroke));
                else if (ped.getDefinition().getEventDetectorTypeName().equals(AnalogHighLimitEventDetectorDefinition.TYPE_NAME))
                    ptsc.addRangeMarker(new ValueMarker(uc.convert(((AnalogHighLimitDetectorVO) ped).getLimit()), highLimitPaint, limitStroke));
            }
        }
        return ImageChartUtils.getChartData(ptsc, width, height, from, to);
    } catch (StringIndexOutOfBoundsException e) {
    // no op
    } catch (NumberFormatException e) {
    // no op
    } catch (ArrayIndexOutOfBoundsException e) {
    // no op
    }
    return null;
}
Also used : DataPointVO(com.serotonin.m2m2.vo.DataPointVO) PointValueFacade(com.serotonin.m2m2.rt.dataImage.PointValueFacade) NumericTimeSeries(com.serotonin.m2m2.util.chart.NumericTimeSeries) TimeSeries(org.jfree.data.time.TimeSeries) DiscreteTimeSeries(com.serotonin.m2m2.util.chart.DiscreteTimeSeries) PointTimeSeriesCollection(com.serotonin.m2m2.util.chart.PointTimeSeriesCollection) Color(java.awt.Color) IOException(java.io.IOException) Paint(java.awt.Paint) TimeZone(java.util.TimeZone) InvalidArgumentException(com.serotonin.InvalidArgumentException) NumericTimeSeries(com.serotonin.m2m2.util.chart.NumericTimeSeries) UnitConverter(javax.measure.converter.UnitConverter) PointValueTime(com.serotonin.m2m2.rt.dataImage.PointValueTime) AnalogLowLimitDetectorVO(com.serotonin.m2m2.vo.event.detector.AnalogLowLimitDetectorVO) ArrayList(java.util.ArrayList) List(java.util.List) ValueMarker(org.jfree.chart.plot.ValueMarker) DiscreteTimeSeries(com.serotonin.m2m2.util.chart.DiscreteTimeSeries)

Example 13 with ValueMarker

use of org.jfree.chart.plot.ValueMarker in project memory-map-plugin by Praqma.

the class MemoryMapBuildAction method makeMarker.

public void makeMarker(String labelName, double value, HashMap<String, ValueMarker> markers) {
    if (!markers.containsKey(labelName)) {
        ValueMarker vm = new ValueMarker(value, Color.BLACK, new BasicStroke(1.2f, BasicStroke.CAP_SQUARE, BasicStroke.JOIN_MITER, 1.0f, new float[] { 6.0f, 6.0f }, 0.0f));
        vm.setLabel(labelName);
        double i = vm.getLabel().length() * labelOffset + 40;
        vm.setLabelOffset(new RectangleInsets(5, i, -20, 5));
        vm.setLabelAnchor(RectangleAnchor.TOP_LEFT);
        vm.setPaint(Color.BLACK);
        vm.setOutlinePaint(Color.BLACK);
        vm.setAlpha(1.0f);
        markers.put(labelName, vm);
    }
}
Also used : BasicStroke(java.awt.BasicStroke) RectangleInsets(org.jfree.ui.RectangleInsets) ValueMarker(org.jfree.chart.plot.ValueMarker)

Example 14 with ValueMarker

use of org.jfree.chart.plot.ValueMarker in project memory-map-plugin by Praqma.

the class MemoryMapBuildAction method createPairedBarCharts.

protected JFreeChart createPairedBarCharts(String title, String yAxis, double max, double min, CategoryDataset dataSet, Collection<ValueMarker> markers) {
    final CategoryAxis domainAxis = new ShiftedCategoryAxis(null);
    final NumberAxis rangeAxis = new NumberAxis(yAxis);
    rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
    rangeAxis.setUpperBound(max);
    rangeAxis.setLowerBound(min);
    BarRenderer renderer = new BarRenderer();
    CategoryPlot plot = new CategoryPlot(dataSet, domainAxis, rangeAxis, renderer);
    plot.setDomainAxis(domainAxis);
    domainAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_90);
    plot.setOrientation(PlotOrientation.VERTICAL);
    plot.setBackgroundPaint(Color.WHITE);
    plot.setOutlinePaint(null);
    plot.setRangeGridlinesVisible(true);
    plot.setRangeGridlinePaint(Color.black);
    for (ValueMarker mkr : markers) {
        plot.addRangeMarker(mkr);
    }
    JFreeChart chart = new JFreeChart(plot);
    chart.setTitle(title);
    return chart;
}
Also used : ShiftedCategoryAxis(hudson.util.ShiftedCategoryAxis) NumberAxis(org.jfree.chart.axis.NumberAxis) ShiftedCategoryAxis(hudson.util.ShiftedCategoryAxis) CategoryAxis(org.jfree.chart.axis.CategoryAxis) BarRenderer(org.jfree.chart.renderer.category.BarRenderer) ValueMarker(org.jfree.chart.plot.ValueMarker) CategoryPlot(org.jfree.chart.plot.CategoryPlot) JFreeChart(org.jfree.chart.JFreeChart)

Example 15 with ValueMarker

use of org.jfree.chart.plot.ValueMarker in project dhis2-core by dhis2.

the class DefaultChartService method getMarker.

/**
 * Returns a horizontal line marker for the given x value and label.
 */
private Marker getMarker(Double value, String label) {
    Marker marker = new ValueMarker(value);
    marker.setPaint(Color.BLACK);
    marker.setStroke(new BasicStroke(1.1f));
    marker.setLabel(label);
    marker.setLabelOffset(new RectangleInsets(-10, 50, 0, 0));
    marker.setLabelFont(SUB_TITLE_FONT);
    return marker;
}
Also used : RectangleInsets(org.jfree.chart.ui.RectangleInsets) ValueMarker(org.jfree.chart.plot.ValueMarker) Marker(org.jfree.chart.plot.Marker) ValueMarker(org.jfree.chart.plot.ValueMarker)

Aggregations

ValueMarker (org.jfree.chart.plot.ValueMarker)15 Marker (org.jfree.chart.plot.Marker)7 JFreeChart (org.jfree.chart.JFreeChart)5 BasicStroke (java.awt.BasicStroke)3 Color (java.awt.Color)3 NumberAxis (org.jfree.chart.axis.NumberAxis)3 CategoryPlot (org.jfree.chart.plot.CategoryPlot)3 Font (java.awt.Font)2 IOException (java.io.IOException)2 ArrayList (java.util.ArrayList)2 List (java.util.List)2 XYTextAnnotation (org.jfree.chart.annotations.XYTextAnnotation)2 CategoryAxis (org.jfree.chart.axis.CategoryAxis)2 ValueAxis (org.jfree.chart.axis.ValueAxis)2 XYPlot (org.jfree.chart.plot.XYPlot)2 BarRenderer (org.jfree.chart.renderer.category.BarRenderer)2 XYLineAndShapeRenderer (org.jfree.chart.renderer.xy.XYLineAndShapeRenderer)2 Minute (org.jfree.data.time.Minute)2 TimeSeries (org.jfree.data.time.TimeSeries)2 RectangleInsets (org.jfree.ui.RectangleInsets)2