Search in sources :

Example 51 with TimeSeries

use of org.jfree.data.time.TimeSeries 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 52 with TimeSeries

use of org.jfree.data.time.TimeSeries 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 53 with TimeSeries

use of org.jfree.data.time.TimeSeries in project GT by Tencent.

the class AbstractRealTimeLineChart method addOneDataset.

/**
 * 插入一种数据,返回该数据的编号
 * 插入多次数据的时候需要保证每种数据的测试进程都是相同的
 * @Title: addOneDataset
 * @Description:
 * @param pkgNames
 * @param dataName
 * @return
 * int 返回数据编号,失败返回-1
 * @throws
 */
public int addOneDataset(String[] objects, String dataName) {
    if (objects == null || objects.length == 0 || dataName == null) {
        return -1;
    }
    objectNum = objects.length;
    dataNum++;
    for (int i = 0; i < objectNum; i++) {
        int index = i * dataNum + (dataNum - 1);
        chart.getXYPlot().getRenderer().setSeriesStroke(index, new BasicStroke(Constant.LINE_WIDTH));
        tsList.add(index, new TimeSeries(objects[i] + "_" + dataName));
        tsEnableList.add(index, true);
        dataset.addSeries(tsList.get(index));
    }
    return dataNum - 1;
}
Also used : BasicStroke(java.awt.BasicStroke) TimeSeries(org.jfree.data.time.TimeSeries)

Example 54 with TimeSeries

use of org.jfree.data.time.TimeSeries in project pentaho-platform by pentaho.

the class TimeSeriesCollectionChartDefinition method setDataByRow.

private void setDataByRow(final IPentahoResultSet data) {
    // TODO Make this routine MDX friendly
    if (data == null) {
        // $NON-NLS-1$
        noDataMessage = Messages.getInstance().getString("CHART.USER_NO_DATA_AVAILABLE");
        // No data so we've got nothing to set
        return;
    // TODO come up with some sort of error strategy here.
    }
    Class timePeriodClass = TimeSeriesCollectionChartDefinition.getTimePeriodClass(getDomainPeriodType());
    Object[] rowData = data.next();
    while (rowData != null) {
        String seriesName = (String) rowData[0];
        TimeSeries wrkSeries = new TimeSeries(seriesName, timePeriodClass);
        for (int column = 1; column < rowData.length - 1; column = column + 2) {
            Date keyDate = getValidDate(rowData[column]);
            TimeSeriesDataItem timeSeriesDataItem = new TimeSeriesDataItem(RegularTimePeriod.createInstance(timePeriodClass, keyDate, RegularTimePeriod.DEFAULT_TIME_ZONE), ((Number) rowData[column + 1]).doubleValue());
            wrkSeries.add(timeSeriesDataItem);
        }
        addSeries(wrkSeries);
        rowData = data.next();
    }
    if ((data.getRowCount() > 0) && (this.getSeriesCount() <= 0)) {
        // $NON-NLS-1$
        noDataMessage = Messages.getInstance().getString("CHART.USER_INCORRECT_DATA_FORMAT");
    }
}
Also used : TimeSeries(org.jfree.data.time.TimeSeries) TimeSeriesDataItem(org.jfree.data.time.TimeSeriesDataItem) Paint(java.awt.Paint) Date(java.util.Date)

Example 55 with TimeSeries

use of org.jfree.data.time.TimeSeries in project Stock-Ticker-Project by IsaiahL12.

the class DynamicDataDemo method graph2.

/**
 * Constructs a new demonstration application.
 *
 * @param title  the frame title.
 */
public JPanel graph2(String title, Vector<Double> avgV, Vector<String> time) {
    final TimeSeries high = new TimeSeries("High");
    final TimeSeries average = new TimeSeries("Price");
    final TimeSeries low = new TimeSeries("Low");
    double hold = 0;
    double hold1 = -1;
    double hold2 = 100000000;
    int spacing = 20;
    for (int i = 0; i < avgV.size(); i++) {
        if (avgV.get(i) != -1 && avgV.get(i) != 0) {
            if (hold1 < avgV.get(i)) {
                hold1 = avgV.get(i);
            }
            if (hold2 > avgV.get(i)) {
                hold2 = avgV.get(i);
            // System.out.println(hold2);
            }
            // Date day = new SimpleDateFormat("HH:MM").parse("9:30");
            try {
                Date date = new SimpleDateFormat("yyyy-MM-dd").parse(time.get(i));
                hold = avgV.get(i);
                average.addOrUpdate(new Day(date), round(hold, 2));
                // average.add( null, round(hold,2));
                high.addOrUpdate(new Day(date), round(hold1, 2));
                low.addOrUpdate(new Day(date), round(hold2, 2));
            // high.add(spacing*i, round(hold1,2));
            // low.add(spacing*i, round(hold2,2));
            } catch (ParseException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    TimeSeriesCollection dataset = new TimeSeriesCollection(high);
    dataset.addSeries(low);
    dataset.addSeries(average);
    JFreeChart chart;
    chart = createChart2(dataset, title);
    chart.getPlot().setBackgroundPaint(Color.BLACK);
    ChartPanel chartPanel = new ChartPanel(chart);
    // chartPanel.overlayChanged(event);
    JPanel content = new JPanel(new BorderLayout());
    content.add(chartPanel);
    // content.add(button, BorderLayout.SOUTH);
    chartPanel.setPreferredSize(new java.awt.Dimension(375, 320));
    // this.add(content);
    return content;
/*
        final XYSeries high = new XYSeries("High");
  	  final XYSeries average = new XYSeries("Price");
  	  final XYSeries low = new XYSeries("Low");
  	  double hold = 0;
  	  double hold1 = -1;
  	  double hold2 = 100000000;
  	  int spacing = 20;
  	  
  	 for (int i =0; i< avgV.size(); i++) {
  		   if (avgV.get(i) != -1 && avgV.get(i) != 0) {
  			   if (hold1 < avgV.get(i)) {
  				   hold1 =  avgV.get(i);
  			   }
  		 
  			   if (hold2 > avgV.get(i)) {
  				   hold2 =  avgV.get(i);
  				   //System.out.println(hold2);
  			   }
  			   
  			  
  			   
  		// Date day = new SimpleDateFormat("HH:MM").parse("9:30");
  		 
  			 hold =  avgV.get(i);
  			average.add(spacing*i, round(hold,2));
  			 high.add(spacing*i, round(hold1,2));
  		 low.add(spacing*i, round(hold2,2));
  		  }
  		  
  	  }
  	  
  	  
  	XYSeriesCollection dataset = new XYSeriesCollection(high); 
    	dataset.addSeries(low);
    	dataset.addSeries(average);
    	JFreeChart chart;
    
    	chart = createChart2(dataset, title);
    	chart.getPlot().setBackgroundPaint( Color.BLACK );
      ChartPanel chartPanel = new ChartPanel(chart);
     // chartPanel.overlayChanged(event);
      
      JPanel content = new JPanel(new BorderLayout());
      content.add(chartPanel);
      //content.add(button, BorderLayout.SOUTH);
      chartPanel.setPreferredSize(new java.awt.Dimension(375, 320));
      //setContentPane(content)
      //this.add(content);
      return content;
      */
}
Also used : JPanel(javax.swing.JPanel) TimeSeries(org.jfree.data.time.TimeSeries) ChartPanel(org.jfree.chart.ChartPanel) Date(java.util.Date) JFreeChart(org.jfree.chart.JFreeChart) BorderLayout(java.awt.BorderLayout) TimeSeriesCollection(org.jfree.data.time.TimeSeriesCollection) ParseException(java.text.ParseException) SimpleDateFormat(java.text.SimpleDateFormat) Day(org.jfree.data.time.Day)

Aggregations

TimeSeries (org.jfree.data.time.TimeSeries)55 TimeSeriesCollection (org.jfree.data.time.TimeSeriesCollection)39 JFreeChart (org.jfree.chart.JFreeChart)12 Date (java.util.Date)11 XYPlot (org.jfree.chart.plot.XYPlot)11 Month (org.jfree.data.time.Month)9 Day (org.jfree.data.time.Day)8 TimeSeriesDataItem (org.jfree.data.time.TimeSeriesDataItem)8 BasicStroke (java.awt.BasicStroke)7 Color (java.awt.Color)7 Map (java.util.Map)7 RegularTimePeriod (org.jfree.data.time.RegularTimePeriod)6 IOException (java.io.IOException)5 SimpleDateFormat (java.text.SimpleDateFormat)5 List (java.util.List)5 DateAxis (org.jfree.chart.axis.DateAxis)5 NumberAxis (org.jfree.chart.axis.NumberAxis)5 XYLineAndShapeRenderer (org.jfree.chart.renderer.xy.XYLineAndShapeRenderer)5 FixedMillisecond (org.jfree.data.time.FixedMillisecond)5 BufferedImage (java.awt.image.BufferedImage)4