Charts.java
/*
* Copyright (c) 2001, Zoltan Farkas All Rights Reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
package org.spf4j.perf.impl.chart;
import java.awt.Color;
import java.awt.image.BufferedImage;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.labels.StandardXYSeriesLabelGenerator;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.PaintScale;
import org.jfree.chart.renderer.xy.XYBlockRenderer;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.chart.title.PaintScaleLegend;
import org.jfree.data.time.FixedMillisecond;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
import org.spf4j.base.Arrays;
import org.spf4j.base.Pair;
/**
*
* @author zoly
*/
public final class Charts {
private Charts() {
}
public static JFreeChart createHeatJFreeChart(final String[] dsNames, final double[][] values,
final long startTimeMillis, final long stepMillis, final String uom, final String chartName) {
final QuantizedXYZDatasetImpl dataSet = new QuantizedXYZDatasetImpl(dsNames, values,
startTimeMillis, stepMillis);
NumberAxis xAxis = new NumberAxis("Time");
xAxis.setStandardTickUnits(dataSet.createXTickUnits());
xAxis.setLowerMargin(0);
xAxis.setUpperMargin(0);
NumberAxis yAxis = new NumberAxis(uom);
yAxis.setStandardTickUnits(dataSet.createYTickUnits());
yAxis.setLowerMargin(0);
yAxis.setUpperMargin(0);
XYBlockRenderer renderer = new XYBlockRenderer();
PaintScale scale;
if (dataSet.getMinValue() >= dataSet.getMaxValue()) {
if (dataSet.getMinValue() == Double.POSITIVE_INFINITY) {
scale = new InverseGrayScale(0, 1);
} else {
scale = new InverseGrayScale(dataSet.getMinValue(), dataSet.getMaxValue() + 1);
}
} else {
scale = new InverseGrayScale(dataSet.getMinValue(), dataSet.getMaxValue());
}
renderer.setPaintScale(scale);
renderer.setBlockWidth(1);
renderer.setBlockHeight(1);
XYPlot plot = new XYPlot(dataSet, xAxis, yAxis, renderer);
plot.setBackgroundPaint(Color.white);
plot.setDomainGridlinesVisible(false);
plot.setRangeGridlinesVisible(false);
plot.setRangeMinorGridlinesVisible(false);
JFreeChart chart = new JFreeChart(chartName, plot);
PaintScaleLegend legend = new PaintScaleLegend(scale, new NumberAxis("Count"));
legend.setMargin(0, 5, 0, 5);
chart.addSubtitle(legend);
chart.removeLegend();
chart.setBackgroundPaint(Color.white);
return chart;
}
private static JFreeChart createJFreeChart(final String chartName, final String uom,
final TimeSeriesCollection timeseriescollection) {
JFreeChart jfreechart = ChartFactory.createTimeSeriesChart(chartName,
"Time", uom, timeseriescollection, true, true, false);
XYPlot xyplot = (XYPlot) jfreechart.getPlot();
DateAxis dateaxis = (DateAxis) xyplot.getDomainAxis();
dateaxis.setVerticalTickLabels(true);
XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer) xyplot.getRenderer();
xylineandshaperenderer.setBaseShapesVisible(true);
xylineandshaperenderer.setUseFillPaint(true);
xylineandshaperenderer.setLegendItemToolTipGenerator(new StandardXYSeriesLabelGenerator("Tooltip {0}"));
return jfreechart;
}
public static BufferedImage createMinMaxAvgCountImg(final String chartName, final long[] timestamps,
final double[] min, final double[] max, final double[] total, final double[] count,
final String uom, final int width, final int height) {
BufferedImage bi = Charts.createTimeSeriesJFreeChart(chartName, timestamps,
new String[]{"min", "max", "avg"}, uom,
new double[][]{min, max, Arrays.divide(total, count)}).createBufferedImage(width, height - height / 3);
BufferedImage bi2 = Charts.createTimeSeriesJFreeChart(null, timestamps,
new String[]{"count"}, "count", new double[][]{count}).createBufferedImage(width, height / 3);
BufferedImage combined = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
combined.getGraphics().drawImage(bi, 0, 0, null);
combined.getGraphics().drawImage(bi2, 0, height - height / 3, null);
return combined;
}
private static TimeSeriesCollection createTimeSeriesCollection(final String[] measurementNames,
final long[] timestamps, final double[][] measurements) {
TimeSeriesCollection timeseriescollection = new TimeSeriesCollection();
for (int i = 0; i < measurementNames.length; i++) {
TimeSeries tseries = new TimeSeries(measurementNames[i]);
for (int j = 0; j < timestamps.length; j++) {
FixedMillisecond ts = new FixedMillisecond(timestamps[j]);
tseries.add(ts, measurements[i][j]);
}
timeseriescollection.addSeries(tseries);
}
return timeseriescollection;
}
public static JFreeChart createTimeSeriesJFreeChart(final String chartName, final long[] timestamps,
final String[] measurementNames, final String uom, final double[][] measurements) {
TimeSeriesCollection timeseriescollection =
createTimeSeriesCollection(measurementNames, timestamps, measurements);
return createJFreeChart(chartName, uom, timeseriescollection);
}
private static TimeSeriesCollection createTimeSeriesCollection(final String[] measurementNames,
final long[][] timestamps, final double[][] measurements) {
TimeSeriesCollection timeseriescollection = new TimeSeriesCollection();
for (int i = 0; i < measurementNames.length; i++) {
TimeSeries tseries = new TimeSeries(measurementNames[i]);
for (int j = 0; j < timestamps[i].length; j++) {
FixedMillisecond ts = new FixedMillisecond(timestamps[i][j]);
tseries.add(ts, measurements[i][j]);
}
timeseriescollection.addSeries(tseries);
}
return timeseriescollection;
}
public static JFreeChart createTimeSeriesJFreeChart(final String chartName, final long[][] timestamps,
final String[] measurementNames, final String uom, final double[][] measurements) {
TimeSeriesCollection timeseriescollection =
createTimeSeriesCollection(measurementNames, timestamps, measurements);
return createJFreeChart(chartName, uom, timeseriescollection);
}
public static Pair<long[], double[][]> fillGaps(final long[] timestamps,
final long[][] data, final int sampleTime, final int nrColumns) {
long startTime = timestamps[0];
int nrSamples = (int) ((timestamps[timestamps.length - 1] - startTime) / sampleTime);
long[] lts = new long[nrSamples];
double[][] dr = new double[nrSamples][];
long nextTime = startTime;
int j = 0;
int maxDeviation = sampleTime / 2;
double[] nodata = new double[nrColumns];
for (int i = 0; i < nrColumns; i++) {
nodata[i] = Double.NaN;
}
for (int i = 0; i < nrSamples; i++) {
lts[i] = nextTime;
if (Math.abs(timestamps[j] - nextTime) < maxDeviation) {
dr[i] = Arrays.toDoubleArray(data[j]);
j++;
} else {
dr[i] = nodata;
}
nextTime += sampleTime;
}
return Pair.of(lts, dr);
}
}