Search in sources :

Example 1 with Marker

use of org.jfree.chart.plot.Marker in project pinot by linkedin.

the class AnomalyGraphGenerator method createGraphMarker.

/**
   * Returns either a value marker (point) or a interval marker (range) depending on provided
   * inputs. By default values are gray or transparent gray.
   * @param intervalStart
   * @param intervalEnd
   * @return
   */
private Marker createGraphMarker(Long intervalStart, Long intervalEnd, String label) {
    Marker anomalyMarker;
    if (intervalEnd == null || intervalStart.equals(intervalEnd)) {
        // Point
        anomalyMarker = new ValueMarker(intervalStart);
        anomalyMarker.setPaint(Color.LIGHT_GRAY);
    } else {
        // Range
        anomalyMarker = new IntervalMarker(intervalStart, intervalEnd);
        anomalyMarker.setPaint(TRANSPARENT_GRAY);
    }
    anomalyMarker.setLabel(label);
    LOG.info("Anomaly marker generated for: {}, {}", intervalStart, intervalEnd);
    return anomalyMarker;
}
Also used : IntervalMarker(org.jfree.chart.plot.IntervalMarker) ValueMarker(org.jfree.chart.plot.ValueMarker) Marker(org.jfree.chart.plot.Marker) IntervalMarker(org.jfree.chart.plot.IntervalMarker) ValueMarker(org.jfree.chart.plot.ValueMarker)

Example 2 with Marker

use of org.jfree.chart.plot.Marker in project pinot by linkedin.

the class AnomalyGraphGenerator method createChart.

/**
   * Creates a chart containing the current/baseline data (in that order) as well as markers for
   * each anomaly interval. timeGranularity and windowMillis are used to determine the date format
   * and spacing for tick marks on the domain (x) axis.
   */
public JFreeChart createChart(final XYDataset dataset, final String metric, final TimeGranularity timeGranularity, final long windowMillis, final Map<RawAnomalyResultDTO, String> anomaliesWithLabels) {
    // create the chart...
    final JFreeChart chart = // no chart title for email
    ChartFactory.createTimeSeriesChart(// no chart title for email
    null, // x axis label
    "Date (" + DEFAULT_TIME_ZONE.getID() + ")", // y axis label
    metric, // data
    dataset, // include legend
    true, // tooltips - n/a if the chart will be saved as an img
    false, // urls - n/a if the chart will be saved as an img
    false);
    // get a reference to the plot for further customisation...
    final XYPlot plot = chart.getXYPlot();
    plot.setBackgroundPaint(Color.white);
    plot.setDomainGridlinesVisible(false);
    plot.setRangeGridlinesVisible(false);
    // dashboard webapp currently uses solid blue for current and dashed blue for baseline
    // (5/2/2016)
    final XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer();
    renderer.setSeriesShapesVisible(0, false);
    renderer.setSeriesShapesVisible(1, false);
    renderer.setSeriesPaint(0, Color.BLUE);
    renderer.setSeriesPaint(1, Color.BLUE);
    // http://www.java2s.com/Code/Java/Chart/JFreeChartLineChartDemo5showingtheuseofacustomdrawingsupplier.htm
    // set baseline to be dashed
    renderer.setSeriesStroke(1, new BasicStroke(2.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND, 1.0f, new float[] { 2.0f, 6.0f }, 0.0f));
    plot.setRenderer(renderer);
    DateAxis axis = (DateAxis) plot.getDomainAxis();
    DateTickUnit dateTickUnit = getDateTickUnit(timeGranularity, windowMillis);
    SimpleDateFormat dateFormat = getDateFormat(timeGranularity);
    axis.setDateFormatOverride(dateFormat);
    axis.setTickUnit(dateTickUnit);
    axis.setVerticalTickLabels(true);
    List<Marker> anomalyIntervals = getAnomalyIntervals(anomaliesWithLabels);
    for (Marker marker : anomalyIntervals) {
        plot.addDomainMarker(marker);
    }
    return chart;
}
Also used : BasicStroke(java.awt.BasicStroke) DateAxis(org.jfree.chart.axis.DateAxis) XYPlot(org.jfree.chart.plot.XYPlot) DateTickUnit(org.jfree.chart.axis.DateTickUnit) XYLineAndShapeRenderer(org.jfree.chart.renderer.xy.XYLineAndShapeRenderer) ValueMarker(org.jfree.chart.plot.ValueMarker) Marker(org.jfree.chart.plot.Marker) IntervalMarker(org.jfree.chart.plot.IntervalMarker) SimpleDateFormat(java.text.SimpleDateFormat) JFreeChart(org.jfree.chart.JFreeChart)

Example 3 with Marker

use of org.jfree.chart.plot.Marker in project pinot by linkedin.

the class AnomalyGraphGenerator method getAnomalyIntervals.

/**
   * Merges overlapping anomalies and creates JFreeChart Markers for each merged point or interval.
   */
private List<Marker> getAnomalyIntervals(Map<RawAnomalyResultDTO, String> anomaliesWithLabels) {
    TreeMap<RawAnomalyResultDTO, String> chronologicalAnomaliesWithLabels = new TreeMap<RawAnomalyResultDTO, String>(new Comparator<RawAnomalyResultDTO>() {

        @Override
        public int compare(RawAnomalyResultDTO o1, RawAnomalyResultDTO o2) {
            int diff = Long.compare(o1.getStartTime(), o2.getStartTime());
            if (diff == 0) {
                diff = o1.compareTo(o2);
            }
            return diff;
        }
    });
    chronologicalAnomaliesWithLabels.putAll(anomaliesWithLabels);
    Long intervalStart = null;
    Long intervalEnd = null;
    // StringBuilder labelBuilder = new StringBuilder();
    List<Marker> anomalyMarkers = new ArrayList<>();
    for (Entry<RawAnomalyResultDTO, String> entry : chronologicalAnomaliesWithLabels.entrySet()) {
        RawAnomalyResultDTO anomalyResult = entry.getKey();
        // String label = entry.getValue();
        Long anomalyStart = anomalyResult.getStartTime();
        Long anomalyEnd = anomalyResult.getEndTime();
        anomalyEnd = anomalyEnd == null ? anomalyStart : anomalyEnd;
        if (intervalStart == null || anomalyStart > intervalEnd) {
            // initialization of intervals
            if (intervalStart != null) {
                // create a new marker if this isn't the first element/initialization
                // ,
                Marker anomalyMarker = createGraphMarker(intervalStart, intervalEnd, null);
                // labelBuilder.toString());
                // labelBuilder.setLength(0);
                anomalyMarkers.add(anomalyMarker);
            }
            intervalStart = anomalyStart;
            intervalEnd = anomalyEnd;
        } else {
            intervalEnd = Math.max(intervalEnd, anomalyEnd);
        }
    // if (labelBuilder.length() > 0) {
    // labelBuilder.append(",");
    // }
    // labelBuilder.append(label);
    }
    // add the last marker
    if (intervalStart != null) {
        // labelBuilder.toString());
        Marker anomalyMarker = createGraphMarker(intervalStart, intervalEnd, null);
        anomalyMarkers.add(anomalyMarker);
    }
    // }
    return anomalyMarkers;
}
Also used : RawAnomalyResultDTO(com.linkedin.thirdeye.datalayer.dto.RawAnomalyResultDTO) ArrayList(java.util.ArrayList) ValueMarker(org.jfree.chart.plot.ValueMarker) Marker(org.jfree.chart.plot.Marker) IntervalMarker(org.jfree.chart.plot.IntervalMarker) TreeMap(java.util.TreeMap)

Aggregations

IntervalMarker (org.jfree.chart.plot.IntervalMarker)3 Marker (org.jfree.chart.plot.Marker)3 ValueMarker (org.jfree.chart.plot.ValueMarker)3 RawAnomalyResultDTO (com.linkedin.thirdeye.datalayer.dto.RawAnomalyResultDTO)1 BasicStroke (java.awt.BasicStroke)1 SimpleDateFormat (java.text.SimpleDateFormat)1 ArrayList (java.util.ArrayList)1 TreeMap (java.util.TreeMap)1 JFreeChart (org.jfree.chart.JFreeChart)1 DateAxis (org.jfree.chart.axis.DateAxis)1 DateTickUnit (org.jfree.chart.axis.DateTickUnit)1 XYPlot (org.jfree.chart.plot.XYPlot)1 XYLineAndShapeRenderer (org.jfree.chart.renderer.xy.XYLineAndShapeRenderer)1