/**
*
*/
package fr.unistra.pelican.util;
import java.awt.Color;
import java.awt.RenderingHints;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import javax.swing.JFrame;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartRenderingInfo;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.StandardXYItemRenderer;
import org.jfree.chart.renderer.xy.XYDotRenderer;
import org.jfree.chart.renderer.xy.XYErrorRenderer;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.data.statistics.HistogramDataset;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYIntervalSeries;
import org.jfree.data.xy.XYIntervalSeriesCollection;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
import org.jfree.io.IOUtils;
import com.sun.xml.internal.txw2.Document;
import fr.unistra.pelican.Image;
import fr.unistra.pelican.algorithms.visualisation.MViewer;
import fr.unistra.pelican.gui.MultiViews.ImagePanel;
/**
* Ever wanted to plot nice charts in a few lines!
*
* @author Benjamin Perret
*
*/
public abstract class ChartCreator {
public static BufferedImage createXYChart(String title,String [] seriesName, String xAxis, String yAxis,double [][] x, double [][] y, int width, int height)
{
return getXYChart(title, seriesName, xAxis, yAxis, x, y).createBufferedImage(width, height);
}
public static JFreeChart getHistogramChart(String title,String serieName, String xAxis, String yAxis,double [] value, int bins)
{
HistogramDataset dataset = new HistogramDataset();
dataset.addSeries(serieName, value, bins);
JFreeChart chart = ChartFactory.createHistogram(title,xAxis,yAxis,dataset,PlotOrientation.VERTICAL,false,false,false);
return chart;
}
public static JFreeChart getHistogramChart(String title,String [] seriesName, String xAxis, String yAxis,double [][] value, int bins)
{
HistogramDataset dataset = new HistogramDataset();
for(int i=0;i<seriesName.length;i++)
{
dataset.addSeries(seriesName[i], value[i], bins);
}
JFreeChart chart = ChartFactory.createHistogram(title,xAxis,yAxis,dataset,PlotOrientation.VERTICAL,true,false,false);
XYPlot xyPlot = (XYPlot)chart.getPlot();
xyPlot.setForegroundAlpha(0.6F);
return chart;
}
public static BufferedImage createHistogramChart(String title,String serieName, String xAxis, String yAxis,double [] value, int bins, int width, int height)
{
return getHistogramChart(title, serieName, xAxis, yAxis, value, bins).createBufferedImage(width, height);
}
public static JFreeChart getXYChart(String title,String [] seriesName, String xAxis, String yAxis,double [][] x, double [][] y)
{
if(x.length != y.length || seriesName.length!=x.length)
{
System.err.println("Error creating chart, seriesName, x and y must have same dimensions");
return null;
}
XYSeriesCollection xyDataset = new XYSeriesCollection();
for(int i=0;i<seriesName.length;i++)
{
if(x[i].length != y[i].length)
{
System.err.println("Error in serie " + (i +1) + " x and y must have same dimensions!");
return null;
}
XYSeries series = new XYSeries(seriesName[i]);
for(int j=0;j<x[i].length;j++)
series.add(x[i][j], y[i][j]);
xyDataset.addSeries(series);
}
JFreeChart chart = ChartFactory.createXYLineChart
(title, // Title
xAxis, // X-Axis label
yAxis, // Y-Axis label
xyDataset, // Dataset
PlotOrientation.VERTICAL, //orientation
true, // Show legend
false,
false
);
return chart;
}
public static JFreeChart getXYPointsChartWithErrorBars(String title,String seriesName, String xAxis, String yAxis,double [] x, double [] y,double [] yErrorDown,double [] yErrorUp)
{
if(x.length != y.length || y.length!=yErrorDown.length || yErrorDown.length!=yErrorUp.length)
{
System.err.println("Error in serie x, y and y up and down errors must have same dimensions!");
return null;
}
XYIntervalSeriesCollection seriesCollection=new XYIntervalSeriesCollection();
XYIntervalSeries intervalSerie=new XYIntervalSeries(seriesName);
for(int i=0;i<x.length;i++)
intervalSerie.add(x[i], x[i], x[i], y[i], yErrorDown[i], yErrorUp[i]);
seriesCollection.addSeries(intervalSerie);
XYItemRenderer renderer = new XYErrorRenderer();
NumberAxis domainAxis=new NumberAxis(xAxis);
NumberAxis valueAxis=new NumberAxis(yAxis);
XYPlot plot = new XYPlot(seriesCollection, domainAxis, valueAxis, renderer);
//renderer0.setSeriesPaint(0,new Color(0,0,255));
//renderer0.setSeriesPaint(1,new Color(255,0,0));
JFreeChart chart=new JFreeChart(title,null,plot,true);
return chart;
}
public static JFreeChart getXYPointsChart(String title,String seriesName, String xAxis, String yAxis,double [] x, double [] y)
{
if(x.length != y.length )
{
System.err.println("Error in series x, y must have same dimensions!");
return null;
}
XYSeriesCollection seriesCollection=new XYSeriesCollection();
XYSeries intervalSerie=new XYSeries(seriesName);
for(int i=0;i<x.length;i++)
intervalSerie.add(x[i], y[i]);
seriesCollection.addSeries(intervalSerie);
int psize=3;
XYDotRenderer renderer = new XYDotRenderer();
renderer.setDotHeight(psize);
renderer.setDotWidth(psize);
NumberAxis domainAxis=new NumberAxis(xAxis);
NumberAxis valueAxis=new NumberAxis(yAxis);
XYPlot plot = new XYPlot(seriesCollection, domainAxis, valueAxis, renderer);
//renderer0.setSeriesPaint(0,new Color(0,0,255));
//renderer0.setSeriesPaint(1,new Color(255,0,0));
JFreeChart chart=new JFreeChart(title,null,plot,true);
return chart;
}
public static BufferedImage createXYPointsChartWithErrorBars(String title,String seriesName, String xAxis, String yAxis,double [] x, double [] y,double [] yErrorDown,double [] yErrorUp, int width, int height)
{
return getXYPointsChartWithErrorBars(title, seriesName, xAxis, yAxis, x, y, yErrorDown, yErrorUp).createBufferedImage(width, height);
}
public static BufferedImage createXYPointsChart(String title,String seriesName, String xAxis, String yAxis,double [] x, double [] y, int width, int height)
{
return getXYPointsChart(title, seriesName, xAxis, yAxis, x, y).createBufferedImage(width, height);
}
public static BufferedImage createXYChart(String title,String serieName, String xAxis, String yAxis,double [] x, double [] y, int width, int height)
{
XYSeries series = new XYSeries(serieName);
for(int i=0;i<x.length;i++)
series.add(x[i], y[i]);
XYDataset xyDataset = new XYSeriesCollection(series);
JFreeChart chart = ChartFactory.createXYLineChart
(title, // Title
xAxis, // X-Axis label
yAxis, // Y-Axis label
xyDataset, // Dataset
PlotOrientation.VERTICAL, //orientation
true, // Show legend
false,
false
);
return chart.createBufferedImage(width, height);
}
public static BufferedImage createXYChart(String title,double [] y)
{
double [] x=new double[y.length];
for(int i=0;i<x.length;i++)
x[i]=i;
return createXYChart(title, "data1", "x", "y", x, y, 800, 600);
}
public static BufferedImage createXYChart(String title,double [] y,int width, int height)
{
double [] x=new double[y.length];
for(int i=0;i<x.length;i++)
x[i]=i;
return createXYChart(title, "data1", "x", "y", x, y, width,height);
}
public static BufferedImage createDoubleAxisXYChart(String title,String serieName1,String serieName2, String xAxis, String yAxis1, String yAxis2,double [] x,double [] y1,double [] y2,int width, int height)
{
// final String chartTitle = "Dual Axis Demo 2";
XYSeriesCollection dataset = new XYSeriesCollection();
XYSeries series = new XYSeries(serieName1);
for(int i=0;i<x.length;i++)
series.add(x[i], y1[i]);
dataset.addSeries(series);
XYSeriesCollection dataset2 = new XYSeriesCollection();
XYSeries series2 = new XYSeries(serieName2);
for(int i=0;i<x.length;i++)
series2.add(x[i], y2[i]);
dataset2.addSeries(series2);
final JFreeChart chart = ChartFactory.createXYLineChart (title, // Title
xAxis, // X-Axis label
yAxis1, // Y-Axis label
dataset, // Dataset
PlotOrientation.VERTICAL, //orientation
true, // Show legend
false,
false
);
// final StandardLegend legend = (StandardLegend) chart.getLegend();
// legend.setDisplaySeriesShapes(true);
XYPlot plot = chart.getXYPlot();
NumberAxis axis2 = new NumberAxis(yAxis2);
axis2.setAutoRangeIncludesZero(false);
plot.setRangeAxis(1, axis2);
plot.setDataset(1, dataset2);
plot.mapDatasetToRangeAxis(1, 1);
//final XYItemRenderer renderer = plot.getRenderer();
// renderer.setToolTipGenerator(StandardXYToolTipGenerator.getTimeSeriesInstance());
/* if (renderer instanceof StandardXYItemRenderer) {
final StandardXYItemRenderer rr = (StandardXYItemRenderer) renderer;
rr.setPlotShapes(true);
rr.setShapesFilled(true);
}*/
final StandardXYItemRenderer renderer2 = new StandardXYItemRenderer();
renderer2.setSeriesPaint(0, Color.black);
plot.setRenderer(1, renderer2);
/* renderer2.setPlotShapes(true);
renderer.setToolTipGenerator(StandardXYToolTipGenerator.getTimeSeriesInstance());
plot.setRenderer(1, renderer2);
*/
/* final DateAxis axis = (DateAxis) plot.getDomainAxis();
axis.setDateFormatOverride(new SimpleDateFormat("MMM-yyyy"));
final ChartPanel chartPanel = new ChartPanel(chart);
chartPanel.setPreferredSize(new java.awt.Dimension(500, 270));
setContentPane(chartPanel);*/
return chart.createBufferedImage(width, height);
}
public static BufferedImage createDoubleAxisXYChart(String title,String [] serieName1,String [] serieName2, String xAxis, String yAxis1, String yAxis2,double [][] x,double [][] y1,double [][] y2,int width, int height)
{
// final String chartTitle = "Dual Axis Demo 2";
XYSeriesCollection dataset = new XYSeriesCollection();
for(int j=0;j<serieName1.length;j++)
{
XYSeries series = new XYSeries(serieName1[j]);
for(int i=0;i<x[j].length;i++)
series.add(x[j][i], y1[j][i]);
dataset.addSeries(series);
}
XYSeriesCollection dataset2 = new XYSeriesCollection();
for(int j=0;j<serieName2.length;j++)
{
XYSeries series = new XYSeries(serieName2[j]);
for(int i=0;i<x[j].length;i++)
series.add(x[j][i], y2[j][i]);
dataset2.addSeries(series);
}
final JFreeChart chart = ChartFactory.createXYLineChart (title, // Title
xAxis, // X-Axis label
yAxis1, // Y-Axis label
dataset, // Dataset
PlotOrientation.VERTICAL, //orientation
true, // Show legend
false,
false
);
// final StandardLegend legend = (StandardLegend) chart.getLegend();
// legend.setDisplaySeriesShapes(true);
XYPlot plot = chart.getXYPlot();
NumberAxis axis2 = new NumberAxis(yAxis2);
axis2.setAutoRangeIncludesZero(false);
plot.setRangeAxis(1, axis2);
plot.setDataset(1, dataset2);
plot.mapDatasetToRangeAxis(1, 1);
//final XYItemRenderer renderer = plot.getRenderer();
// renderer.setToolTipGenerator(StandardXYToolTipGenerator.getTimeSeriesInstance());
/* if (renderer instanceof StandardXYItemRenderer) {
final StandardXYItemRenderer rr = (StandardXYItemRenderer) renderer;
rr.setPlotShapes(true);
rr.setShapesFilled(true);
}*/
final StandardXYItemRenderer renderer2 = new StandardXYItemRenderer();
renderer2.setSeriesPaint(0, Color.black);
plot.setRenderer(1, renderer2);
/* renderer2.setPlotShapes(true);
renderer.setToolTipGenerator(StandardXYToolTipGenerator.getTimeSeriesInstance());
plot.setRenderer(1, renderer2);
*/
/* final DateAxis axis = (DateAxis) plot.getDomainAxis();
axis.setDateFormatOverride(new SimpleDateFormat("MMM-yyyy"));
final ChartPanel chartPanel = new ChartPanel(chart);
chartPanel.setPreferredSize(new java.awt.Dimension(500, 270));
setContentPane(chartPanel);*/
return chart.createBufferedImage(width, height);
}
public static void displayChart(String title,String [] seriesName, String xAxis, String yAxis,double [][] x, double [][] y, int width, int height)
{
JFrame frame=new JFrame();
frame.setTitle(title);
ImagePanel imp=new ImagePanel();
imp.setImage(createXYChart(title, seriesName, xAxis, yAxis, x, y, width, height));
frame.add(imp);
frame.setSize(width,height);
frame.setVisible(true);
}
public static void displayChart(String title,String serieName, String xAxis, String yAxis,double [] x, double [] y, int width, int height)
{
JFrame frame=new JFrame();
frame.setTitle(title);
ImagePanel imp=new ImagePanel();
imp.setImage(createXYChart(title, serieName, xAxis, yAxis, x, y, width, height));
frame.add(imp);
frame.setSize(width,height);
frame.setVisible(true);
}
public static void displayChart(String title,double [] y)
{
JFrame frame=new JFrame();
frame.setTitle(title);
ImagePanel imp=new ImagePanel();
imp.setImage(createXYChart(title,y));
frame.add(imp);
frame.setSize(600,800);
frame.setVisible(true);
}
public static void displayChart(String title,double [] y, int width, int height)
{
JFrame frame=new JFrame();
frame.setTitle(title);
ImagePanel imp=new ImagePanel();
imp.setImage(createXYChart(title,y,width,height));
frame.add(imp);
frame.setSize(600,800);
frame.setVisible(true);
}
public static void main(String [] args){
double [] x={0.1,1.0};
double [] y={0.5,0.7};
double [] yd={0.4,0.5};
double [] yu={0.65,0.75};
JFreeChart chart=getXYPointsChartWithErrorBars("test", "serie1", "des x", "des y", x, y, yd, yu);
MViewer.exec().add(chart.createBufferedImage(600, 600));
}
}