001    package org.expasy.jpl.commons.collection.render;
002    
003    
004    import java.awt.Dimension;
005    import java.util.List;
006    import org.expasy.jpl.commons.base.render.BarChartRenderer;
007    import org.expasy.jpl.commons.base.render.ImageFormat;
008    import org.expasy.jpl.commons.collection.stat.StatisticalSerie;
009    import org.jfree.chart.renderer.xy.XYBarRenderer;
010    import org.jfree.data.xy.XYSeriesCollection;
011    
012    
013    /**
014     * This object renders {@code StatisticalSerie} objects.
015     * 
016     * @author nikitin
017     * 
018     * @version 1.0
019     * 
020     */
021    public final class StatisticalSerieRenderer<T extends Number> extends
022        Abstract2DChartRenderer<StatisticalSerie<T>> implements BarChartRenderer {
023            
024            private static final XYBarRenderer DEFAULT_RENDERER;
025            
026            /** the peak bar width */
027            private static final double BAR_WIDTH = 0.0;
028            
029            static {
030                    XYBarRenderer.setDefaultShadowsVisible(false);
031                    
032                    DEFAULT_RENDERER = new XYBarRenderer();
033                    DEFAULT_RENDERER.setDrawBarOutline(false);
034                    DEFAULT_RENDERER.setMargin(0.0);
035            }
036            
037            private StatisticalSerieRenderer(XYBarRenderer renderer,
038                ImageFormat format, Dimension dim) {
039                    super(renderer, format, dim);
040            }
041            
042            public static <T extends Number> StatisticalSerieRenderer<T> newInstance() {
043                    return new StatisticalSerieRenderer<T>(DEFAULT_RENDERER,
044                        Abstract2DChartRenderer.DEFAULT_IMAGE_FORMAT,
045                        Abstract2DChartRenderer.DEFAULT_DIMENSION);
046            }
047            
048            @Override
049            public String getXLegend() {
050                    return "x";
051            }
052            
053            @Override
054            public String getYLegend() {
055                    return "frequency";
056            }
057            
058            @Override
059            public XYSeriesCollection initDataset() {
060                    XYSeriesCollection dataset = new XYSeriesCollection();
061                    dataset.setIntervalWidth(BAR_WIDTH);
062                    return dataset;
063            }
064            
065            public void setBarWidth(double width) {
066                    dataset.setIntervalWidth(width);
067            }
068            
069            /**
070             * Add the statistical data set (default colors: 1st serie (blue), 2nd serie
071             * (red)).
072             * 
073             * @param statSerie the statistical serie to render.
074             * @param title the title associated to the data set.
075             */
076            public void populateData(StatisticalSerie<T> statSerie) {
077                    List<T> values = statSerie.getValues();
078                    
079                    for (int i = 0; i < values.size(); i++) {
080                            T x = values.get(i);
081                            double y = statSerie.getFrequency(x);
082                            
083                            addToCurrentDataSeries(x.doubleValue(), y);
084                    }
085            }
086            
087            /**
088             * Export as image file.
089             * 
090             * @param statSerie the statistical serie to render and export.
091             * @param dir the directory to put new file in.
092             * @param title the file name.
093             */
094            public void exportChart(StatisticalSerie<T> statSerie, String dir,
095                String title) {
096                    addDataSet(statSerie, title);
097                    exportChart(dir, title);
098            }
099            
100            /**
101             * Export a chart (prerequisite: data sets have already been entered via
102             * {@code addDataSet} method).
103             * 
104             * @param dir the directory to put new file in.
105             * @param title the file name.
106             */
107            public void exportChart(String dir, String title) {
108                    exportChart(dir + "/" + title);
109            }
110            
111    }