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;
}
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;
}
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;
}
Aggregations