package umontreal.iro.lecuyer.charts;

import   umontreal.iro.lecuyer.stat.TallyStore;

import   org.jfree.chart.ChartPanel;
import   org.jfree.chart.ChartFactory;
import   org.jfree.chart.axis.NumberAxis;
import   org.jfree.chart.plot.XYPlot;
import   org.jfree.chart.plot.PlotOrientation;
import   org.jfree.data.xy.XYSeriesCollection;
import   org.jfree.data.xy.XYSeries;

import   cern.colt.list.DoubleArrayList;

import   java.util.ListIterator;
import   java.util.Locale;
import   java.util.Formatter;
import   javax.swing.JFrame;

/**
 * This class provides additional tools to create and manage empirical
 * plots. Empirical plots are used to plot empirical distributions. The
 * {@link EmpiricalChart} class is the simplest way to produce empirical
 *   plots only. Each {@link EmpiricalChart} object is linked with an
 * {@link umontreal.iro.lecuyer.charts.EmpiricalSeriesCollection EmpiricalSeriesCollection}
 * data set.
 * 
 */
public class EmpiricalChart extends XYChart  {

   protected void init (String title, String XLabel, String YLabel) {
      // create the chart...
      chart = ChartFactory.createXYLineChart(
         title,                    // chart title
         XLabel,                   // x axis label
         YLabel,                   // y axis label
         dataset.getSeriesCollection(), // data
         PlotOrientation.VERTICAL,
         true,                     // include legend
         true,                     // tool tips
         false                     // urls
      );
      ((XYPlot)chart.getPlot()).setRenderer(dataset.getRenderer());
      // Initialize axis variables
      XAxis = new Axis((NumberAxis)((XYPlot) chart.getPlot()).getDomainAxis(),
                Axis.ORIENTATION_HORIZONTAL);
      YAxis = new Axis((NumberAxis)((XYPlot) chart.getPlot()).getRangeAxis(),
                Axis.ORIENTATION_VERTICAL);
      fixZeroPoint();
   }


   private void fixZeroPoint() {
      // reset the first point (x0, 0) with x0 at the beginning of x-axis
      double xmin = Math.min (XAxis.getAxis().getRange().getLowerBound(),
                                                   XAxis.getTwinAxisPosition());
      XYSeriesCollection col = (XYSeriesCollection)dataset.getSeriesCollection();
      for (int i = 0; i < col.getSeriesCount(); i++) {
         XYSeries ser = col.getSeries (i);
         ser.remove(0);   // remove temporary 0-point
         ser.add(xmin, 0); // replace
      }
   }

   /**
    * Initializes a new EmpiricalChart instance with an empty data set.
    * 
    */
   public EmpiricalChart()  {
      super();
      dataset = new EmpiricalSeriesCollection();
      init (null, null, null);
   }


   /**
    * Initializes a new EmpiricalChart instance with data data.
    *    title is a title, XLabel is a short description of
    *    the x-axis and YLabel a short description of the y-axis.
    *    The input vectors data represents a collection of observation sets.
    *    Each vector of data represents a x-coordinates set.
    *    Therefore data
    * [i], i = 0,…, n - 1, is used to draw the i-th plot.
    *    The values of each observation set data[i] must be sorted
    *    in increasing order.
    * 
    * @param title chart title.
    * 
    *    @param XLabel Label on x-axis.
    * 
    *    @param YLabel Label on y-axis.
    * 
    *    @param data series of point sets.
    * 
    * 
    */
   public EmpiricalChart (String title, String XLabel, String YLabel,
                          double[]... data)  {
      super();
      dataset = new EmpiricalSeriesCollection(data);
      init (title, XLabel, YLabel);
   }


   /**
    * Initializes a new EmpiricalChart instance with a set of points
    *    data. title is a title, XLabel is a short
    *    description of the x-axis and YLabel a short description of the
    *    y-axis. Vector data represents a x-coordinates set. The values
    *    of this observation set must be sorted in increasing order. Only
    *    the first numPoints of data will
    *    be considered to plot.
    * 
    * @param title chart title.
    * 
    *    @param XLabel Label on x-axis.
    * 
    *    @param YLabel Label on y-axis.
    * 
    *    @param data series of point sets.
    * 
    *    @param numPoints number of points to plot
    * 
    * 
    */
   public EmpiricalChart (String title, String XLabel, String YLabel,
                          double[] data, int numPoints)  {
      super();
      dataset = new EmpiricalSeriesCollection(data, numPoints);
      init (title, XLabel, YLabel);
   }


   /**
    * Similar to the above constructor, but with DoubleArrayList.
    *    A {@link cern.colt.list.DoubleArrayList DoubleArrayList} from the Colt library is
    *    used to store data. The values of each observation set data[i]
    *    must be sorted in increasing order.
    * 
    * @param title chart title.
    * 
    *    @param XLabel Label on x-axis.
    * 
    *    @param YLabel Label on y-axis.
    * 
    *    @param data series of point sets.
    * 
    * 
    */
   public EmpiricalChart (String title, String XLabel, String YLabel,
                          DoubleArrayList... data)  {
      super();
      dataset = new EmpiricalSeriesCollection(data);
      init (title, XLabel, YLabel);
   }


   /**
    * Initializes a new EmpiricalChart instance with data arrays
    *    contained in each
    *    {@link umontreal.iro.lecuyer.stat.TallyStore TallyStore} object. The input
    *    parameter tallies represents a collection of observation sets.
    *    Therefore, the i-th tallies is used to draw
    *      the i-th plot.
    * 
    * @param title chart title.
    * 
    *    @param XLabel Label on x-axis.
    * 
    *    @param YLabel Label on y-axis.
    * 
    *    @param tallies series of observation sets.
    * 
    * 
    */
   public EmpiricalChart (String title, String XLabel, String YLabel,
                          TallyStore... tallies)  {
      super();
      dataset = new EmpiricalSeriesCollection(tallies);
      init (title, XLabel, YLabel);
   }


   /**
    * Initializes a new EmpiricalChart instance with data data.
    *    The input parameter data represents a set of plotting data.
    *    XYSeriesCollection is a JFreeChart-like container class
    *     used to store and manage observation sets.
    * 
    * @param title chart title.
    * 
    *    @param XLabel Label on x-axis.
    * 
    *    @param YLabel Label on y-axis.
    * 
    *    @param data series collection.
    * 
    */
   public EmpiricalChart (String title, String XLabel, String YLabel,
                          XYSeriesCollection data)  {
      super();
      dataset = new EmpiricalSeriesCollection(data);
      init (title, XLabel, YLabel);
   }


   /**
    * Returns the chart's dataset.
    * 
    * @return the chart's dataset.
    * 
    */
   public EmpiricalSeriesCollection getSeriesCollection()  {
      return (EmpiricalSeriesCollection)dataset;
   }


   /**
    * Links a new dataset to the current chart.
    * 
    * @param dataset new dataset.
    * 
    * 
    */
   public void setSeriesCollection (EmpiricalSeriesCollection dataset)  {
      this.dataset = dataset;
   }


   /**
    * Synchronizes x-axis ticks to the s-th series x-values.
    * 
    * @param s series used to define ticks.
    * 
    * 
    */
   public void setTicksSynchro (int s)  {
      XYSeriesCollection seriesCollection = (XYSeriesCollection)this.dataset.getSeriesCollection();
      double[] values = new double[seriesCollection.getItemCount(s)];

      for(int i = 0; i < seriesCollection.getItemCount(s); i++)
         values[i] = seriesCollection.getXValue(s, i);

      XAxis.setLabels(values);
   }


   /**
    * Displays chart on the screen using Swing.
    *    This method creates an application containing a chart panel displaying
    *    the chart.  The created frame is positioned on-screen, and displayed before
    *    it is returned. The width and the height
    *    of the chart are measured in pixels.
    * 
    * @param width frame width in pixels.
    * 
    *    @param height frame height in pixels.
    * 
    *    @return frame containing the chart.
    * 
    */
   public JFrame view (int width, int height)  {
      JFrame myFrame;
      if(chart.getTitle() != null)
         myFrame = new JFrame("EmpiricalChart from SSJ : " + chart.getTitle().getText());
      else
         myFrame = new JFrame("EmpiricalChart from SSJ");
      ChartPanel chartPanel = new ChartPanel(chart);
      chartPanel.setPreferredSize(new java.awt.Dimension(width, height));
      myFrame.setContentPane(chartPanel);
      myFrame.pack();
      myFrame.setDefaultCloseOperation (JFrame.DISPOSE_ON_CLOSE);
      myFrame.setLocationRelativeTo (null);
      myFrame.setVisible(true);
      return myFrame;
   }


   public String toLatex (double width, double height)  {
      double xunit, yunit;
      double[] save = new double[4];

      if(dataset.getSeriesCollection().getSeriesCount() == 0)
         throw new IllegalArgumentException("Empty chart");

      //Calcul des parametres d'echelle et de decalage
      double XScale = computeXScale(XAxis.getTwinAxisPosition());
      double YScale = computeYScale(YAxis.getTwinAxisPosition());

      xunit = width / ((Math.max(XAxis.getAxis().getRange().getUpperBound(), XAxis.getTwinAxisPosition()) * XScale) - (Math.min(XAxis.getAxis().getRange().getLowerBound(), XAxis.getTwinAxisPosition()) * XScale));
      //taille d'une unite en x et en cm dans l'objet "tikzpicture"
      yunit = height / ((Math.max(YAxis.getAxis().getRange().getUpperBound(), YAxis.getTwinAxisPosition()) * YScale) - (Math.min(YAxis.getAxis().getRange().getLowerBound(), YAxis.getTwinAxisPosition()) * YScale));
      //taille d'une unite en y et en cm dans l'objet "tikzpicture"

      Formatter formatter = new Formatter(Locale.US);

      /*Entete du document*/
      if (latexDocFlag) {
         formatter.format("\\documentclass[12pt]{article}%n%n");
         formatter.format("\\usepackage{tikz}%n\\usetikzlibrary{plotmarks}%n\\begin{document}%n%n");
      }
      if(chart.getTitle() != null)
         formatter.format("%% PGF/TikZ picture from SSJ : %s%n", chart.getTitle().getText());
      else
         formatter.format("%% PGF/TikZ picture from SSJ %n");
      formatter.format("%% XScale = %s,  YScale = %s,  XShift = %s,  YShift = %s%n", XScale, YScale, XAxis.getTwinAxisPosition(), YAxis.getTwinAxisPosition());
      formatter.format("%% Therefore, thisFileXValue = (originalSeriesXValue+XShift)*XScale%n");
      formatter.format("%%        and thisFileYValue = (originalSeriesYValue+YShift)*YScale%n%n");
      if (chart.getTitle() != null)
         formatter.format("\\begin{figure}%n");
      formatter.format("\\begin{center}%n");
      formatter.format("\\begin{tikzpicture}[x=%scm, y=%scm]%n", xunit, yunit);
      formatter.format("\\footnotesize%n");
      if (grid)
         formatter.format("\\draw[color=lightgray] (%s, %s) grid[xstep = %s, ystep=%s] (%s, %s);%n",
            (Math.min(XAxis.getAxis().getRange().getLowerBound(), XAxis.getTwinAxisPosition())-XAxis.getTwinAxisPosition()) * XScale,
            (Math.min(YAxis.getAxis().getRange().getLowerBound(), YAxis.getTwinAxisPosition())-YAxis.getTwinAxisPosition()) * YScale,
            xstepGrid*XScale, ystepGrid*YScale,
            (Math.max(XAxis.getAxis().getRange().getUpperBound(), XAxis.getTwinAxisPosition())-XAxis.getTwinAxisPosition()) * XScale,
            (Math.max(YAxis.getAxis().getRange().getUpperBound(), YAxis.getTwinAxisPosition())-YAxis.getTwinAxisPosition()) * YScale);
      setTick0Flags();
      formatter.format("%s", XAxis.toLatex(XScale));
      formatter.format("%s", YAxis.toLatex(YScale));

      formatter.format("%s", dataset.toLatex(XScale, YScale, XAxis.getTwinAxisPosition(), YAxis.getTwinAxisPosition(),
                                                            XAxis.getAxis().getLowerBound(), XAxis.getAxis().getUpperBound(),
                                                            YAxis.getAxis().getLowerBound(), YAxis.getAxis().getUpperBound()));

      formatter.format("\\end{tikzpicture}%n");
      formatter.format("\\end{center}%n");
      if (chart.getTitle() != null) {
         formatter.format("\\caption{");
         formatter.format(chart.getTitle().getText());
         formatter.format("}%n\\end{figure}%n");
      }
      if (latexDocFlag)
         formatter.format("\\end{document}%n");
      return formatter.toString();
   }


}

 

Ads help maintain this website.