001    /* ===========================================================
002     * JFreeChart : a free chart library for the Java(tm) platform
003     * ===========================================================
004     *
005     * (C) Copyright 2000-2007, by Object Refinery Limited and Contributors.
006     *
007     * Project Info:  http://www.jfree.org/jfreechart/index.html
008     *
009     * This library is free software; you can redistribute it and/or modify it 
010     * under the terms of the GNU Lesser General Public License as published by 
011     * the Free Software Foundation; either version 2.1 of the License, or 
012     * (at your option) any later version.
013     *
014     * This library is distributed in the hope that it will be useful, but 
015     * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
016     * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 
017     * License for more details.
018     *
019     * You should have received a copy of the GNU Lesser General Public
020     * License along with this library; if not, write to the Free Software
021     * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, 
022     * USA.  
023     *
024     * [Java is a trademark or registered trademark of Sun Microsystems, Inc. 
025     * in the United States and other countries.]
026     *
027     * -----------------
028     * ChartFactory.java
029     * -----------------
030     * (C) Copyright 2001-2007, by Object Refinery Limited and Contributors.
031     *
032     * Original Author:  David Gilbert (for Object Refinery Limited);
033     * Contributor(s):   Serge V. Grachov;
034     *                   Joao Guilherme Del Valle;
035     *                   Bill Kelemen;
036     *                   Jon Iles;
037     *                   Jelai Wang;
038     *                   Richard Atkinson;
039     *                   David Browning (for Australian Institute of Marine 
040     *                       Science);
041     *                   Benoit Xhenseval;
042     *
043     * Changes
044     * -------
045     * 19-Oct-2001 : Version 1, most methods transferred from JFreeChart.java (DG);
046     * 22-Oct-2001 : Added methods to create stacked bar charts (DG);
047     *               Renamed DataSource.java --> Dataset.java etc. (DG);
048     * 31-Oct-2001 : Added 3D-effect vertical bar and stacked-bar charts, 
049     *               contributed by Serge V. Grachov (DG);
050     * 07-Nov-2001 : Added a flag to control whether or not a legend is added to 
051     *               the chart (DG);
052     * 17-Nov-2001 : For pie chart, changed dataset from CategoryDataset to 
053     *               PieDataset (DG);
054     * 30-Nov-2001 : Removed try/catch handlers from chart creation, as the 
055     *               exception are now RuntimeExceptions, as suggested by Joao 
056     *               Guilherme Del Valle (DG);
057     * 06-Dec-2001 : Added createCombinableXXXXXCharts methods (BK);
058     * 12-Dec-2001 : Added createCandlestickChart() method (DG);
059     * 13-Dec-2001 : Updated methods for charts with new renderers (DG);
060     * 08-Jan-2002 : Added import for 
061     *               com.jrefinery.chart.combination.CombinedChart (DG);
062     * 31-Jan-2002 : Changed the createCombinableVerticalXYBarChart() method to use
063     *               renderer (DG);
064     * 06-Feb-2002 : Added new method createWindPlot() (DG);
065     * 23-Apr-2002 : Updates to the chart and plot constructor API (DG);
066     * 21-May-2002 : Added new method createAreaChart() (JI);
067     * 06-Jun-2002 : Added new method createGanttChart() (DG);
068     * 11-Jun-2002 : Renamed createHorizontalStackedBarChart() 
069     *               --> createStackedHorizontalBarChart() for consistency (DG);
070     * 06-Aug-2002 : Updated Javadoc comments (DG);
071     * 21-Aug-2002 : Added createPieChart(CategoryDataset) method (DG);
072     * 02-Oct-2002 : Fixed errors reported by Checkstyle (DG);
073     * 09-Oct-2002 : Added methods including tooltips and URL flags (DG);
074     * 06-Nov-2002 : Moved renderers into a separate package (DG);
075     * 18-Nov-2002 : Changed CategoryDataset to TableDataset (DG);
076     * 21-Mar-2003 : Incorporated HorizontalCategoryAxis3D, see bug id 685501 (DG);
077     * 13-May-2003 : Merged some horizontal and vertical methods (DG);
078     * 24-May-2003 : Added support for timeline in createHighLowChart (BK);
079     * 07-Jul-2003 : Added createHistogram() method contributed by Jelai Wang (DG);
080     * 27-Jul-2003 : Added createStackedAreaXYChart() method (RA);
081     * 05-Aug-2003 : added new method createBoxAndWhiskerChart (DB);
082     * 08-Sep-2003 : Changed ValueAxis API (DG);
083     * 07-Oct-2003 : Added stepped area XY chart contributed by Matthias Rose (DG);
084     * 06-Nov-2003 : Added createWaterfallChart() method (DG);
085     * 20-Nov-2003 : Set rendering order for 3D bar charts to fix overlapping 
086     *               problems (DG);
087     * 25-Nov-2003 : Added createWaferMapChart() method (DG);
088     * 23-Dec-2003 : Renamed createPie3DChart() --> createPieChart3D for 
089     *               consistency (DG);
090     * 20-Jan-2004 : Added createPolarChart() method (DG);
091     * 28-Jan-2004 : Fixed bug (882890) with axis range in 
092     *               createStackedXYAreaChart() method (DG);
093     * 25-Feb-2004 : Renamed XYToolTipGenerator --> XYItemLabelGenerator (DG);
094     * 11-Mar-2004 : Updated for pie chart changes (DG);
095     * 27-Apr-2004 : Added new createPieChart() method contributed by Benoit 
096     *               Xhenseval (see RFE 942195) (DG);
097     * 11-May-2004 : Split StandardCategoryItemLabelGenerator 
098     *               --> StandardCategoryToolTipGenerator and
099     *               StandardCategoryLabelGenerator (DG);
100     * 06-Jan-2005 : Removed deprecated methods (DG);
101     * 27-Jan-2005 : Added new constructor to LineAndShapeRenderer (DG);
102     * 28-Feb-2005 : Added docs to createBubbleChart() method (DG);
103     * 17-Mar-2005 : Added createRingPlot() method (DG);
104     * 21-Apr-2005 : Replaced Insets with RectangleInsets (DG);
105     * 29-Nov-2005 : Removed signal chart (DG);
106     * ------------- JFREECHART 1.0.x ---------------------------------------------
107     * 26-Jan-2006 : Corrected API docs for createScatterPlot() (DG);
108     * 23-Aug-2006 : Modified createStackedXYAreaChart() to use 
109     *               StackedXYAreaRenderer2, because StackedXYAreaRenderer doesn't
110     *               handle negative values (DG);
111     * 27-Sep-2006 : Update createPieChart() method for deprecated code (DG);
112     * 29-Nov-2006 : Update createXYBarChart() to use a time based tool tip 
113     *               generator is a DateAxis is requested (DG);
114     * 17-Jan-2007 : Added createBoxAndWhiskerChart() method from patch 1603937
115     *               submitted by Darren Jung (DG);
116     * 10-Jul-2007 : Added new methods to create pie charts with locale for
117     *               section label and tool tip formatting (DG);
118     *
119     */
120    
121    package org.jfree.chart;
122    
123    import java.awt.Color;
124    import java.awt.Font;
125    import java.text.DateFormat;
126    import java.text.NumberFormat;
127    import java.util.Iterator;
128    import java.util.List;
129    import java.util.Locale;
130    
131    import org.jfree.chart.axis.CategoryAxis;
132    import org.jfree.chart.axis.CategoryAxis3D;
133    import org.jfree.chart.axis.DateAxis;
134    import org.jfree.chart.axis.NumberAxis;
135    import org.jfree.chart.axis.NumberAxis3D;
136    import org.jfree.chart.axis.Timeline;
137    import org.jfree.chart.axis.ValueAxis;
138    import org.jfree.chart.labels.BoxAndWhiskerToolTipGenerator;
139    import org.jfree.chart.labels.HighLowItemLabelGenerator;
140    import org.jfree.chart.labels.IntervalCategoryToolTipGenerator;
141    import org.jfree.chart.labels.ItemLabelAnchor;
142    import org.jfree.chart.labels.ItemLabelPosition;
143    import org.jfree.chart.labels.PieToolTipGenerator;
144    import org.jfree.chart.labels.StandardCategoryToolTipGenerator;
145    import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
146    import org.jfree.chart.labels.StandardPieToolTipGenerator;
147    import org.jfree.chart.labels.StandardXYToolTipGenerator;
148    import org.jfree.chart.labels.StandardXYZToolTipGenerator;
149    import org.jfree.chart.labels.XYToolTipGenerator;
150    import org.jfree.chart.plot.CategoryPlot;
151    import org.jfree.chart.plot.Marker;
152    import org.jfree.chart.plot.MultiplePiePlot;
153    import org.jfree.chart.plot.PiePlot;
154    import org.jfree.chart.plot.PiePlot3D;
155    import org.jfree.chart.plot.PlotOrientation;
156    import org.jfree.chart.plot.PolarPlot;
157    import org.jfree.chart.plot.RingPlot;
158    import org.jfree.chart.plot.ValueMarker;
159    import org.jfree.chart.plot.WaferMapPlot;
160    import org.jfree.chart.plot.XYPlot;
161    import org.jfree.chart.renderer.DefaultPolarItemRenderer;
162    import org.jfree.chart.renderer.WaferMapRenderer;
163    import org.jfree.chart.renderer.category.AreaRenderer;
164    import org.jfree.chart.renderer.category.BarRenderer;
165    import org.jfree.chart.renderer.category.BarRenderer3D;
166    import org.jfree.chart.renderer.category.BoxAndWhiskerRenderer;
167    import org.jfree.chart.renderer.category.CategoryItemRenderer;
168    import org.jfree.chart.renderer.category.GanttRenderer;
169    import org.jfree.chart.renderer.category.LineAndShapeRenderer;
170    import org.jfree.chart.renderer.category.LineRenderer3D;
171    import org.jfree.chart.renderer.category.StackedAreaRenderer;
172    import org.jfree.chart.renderer.category.StackedBarRenderer;
173    import org.jfree.chart.renderer.category.StackedBarRenderer3D;
174    import org.jfree.chart.renderer.category.WaterfallBarRenderer;
175    import org.jfree.chart.renderer.xy.CandlestickRenderer;
176    import org.jfree.chart.renderer.xy.HighLowRenderer;
177    import org.jfree.chart.renderer.xy.StackedXYAreaRenderer2;
178    import org.jfree.chart.renderer.xy.WindItemRenderer;
179    import org.jfree.chart.renderer.xy.XYAreaRenderer;
180    import org.jfree.chart.renderer.xy.XYBarRenderer;
181    import org.jfree.chart.renderer.xy.XYBoxAndWhiskerRenderer;
182    import org.jfree.chart.renderer.xy.XYBubbleRenderer;
183    import org.jfree.chart.renderer.xy.XYItemRenderer;
184    import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
185    import org.jfree.chart.renderer.xy.XYStepAreaRenderer;
186    import org.jfree.chart.renderer.xy.XYStepRenderer;
187    import org.jfree.chart.title.TextTitle;
188    import org.jfree.chart.urls.PieURLGenerator;
189    import org.jfree.chart.urls.StandardCategoryURLGenerator;
190    import org.jfree.chart.urls.StandardPieURLGenerator;
191    import org.jfree.chart.urls.StandardXYURLGenerator;
192    import org.jfree.chart.urls.StandardXYZURLGenerator;
193    import org.jfree.chart.urls.XYURLGenerator;
194    import org.jfree.data.category.CategoryDataset;
195    import org.jfree.data.category.IntervalCategoryDataset;
196    import org.jfree.data.general.DefaultPieDataset;
197    import org.jfree.data.general.PieDataset;
198    import org.jfree.data.general.WaferMapDataset;
199    import org.jfree.data.statistics.BoxAndWhiskerCategoryDataset;
200    import org.jfree.data.statistics.BoxAndWhiskerXYDataset;
201    import org.jfree.data.xy.IntervalXYDataset;
202    import org.jfree.data.xy.OHLCDataset;
203    import org.jfree.data.xy.TableXYDataset;
204    import org.jfree.data.xy.WindDataset;
205    import org.jfree.data.xy.XYDataset;
206    import org.jfree.data.xy.XYZDataset;
207    import org.jfree.ui.Layer;
208    import org.jfree.ui.RectangleEdge;
209    import org.jfree.ui.RectangleInsets;
210    import org.jfree.ui.TextAnchor;
211    import org.jfree.util.SortOrder;
212    import org.jfree.util.TableOrder;
213    
214    /**
215     * A collection of utility methods for creating some standard charts with 
216     * JFreeChart.
217     */
218    public abstract class ChartFactory {
219    
220        /**
221         * Creates a pie chart with default settings.
222         * <P>
223         * The chart object returned by this method uses a {@link PiePlot} instance 
224         * as the plot.
225         *
226         * @param title  the chart title (<code>null</code> permitted).
227         * @param dataset  the dataset for the chart (<code>null</code> permitted).
228         * @param legend  a flag specifying whether or not a legend is required.
229         * @param tooltips  configure chart to generate tool tips?
230         * @param locale  the locale (<code>null</code> not permitted).
231         *
232         * @return A pie chart.
233         * 
234         * @since 1.0.7
235         */
236        public static JFreeChart createPieChart(String title, PieDataset dataset,
237                boolean legend, boolean tooltips, Locale locale) {
238    
239            PiePlot plot = new PiePlot(dataset);
240            plot.setLabelGenerator(new StandardPieSectionLabelGenerator(locale));
241            plot.setInsets(new RectangleInsets(0.0, 5.0, 5.0, 5.0));
242            if (tooltips) {
243                plot.setToolTipGenerator(new StandardPieToolTipGenerator(locale));
244            }
245            return new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT, plot, 
246                    legend);
247    
248        }
249    
250        /**
251         * Creates a pie chart with default settings.
252         * <P>
253         * The chart object returned by this method uses a {@link PiePlot} instance 
254         * as the plot.
255         *
256         * @param title  the chart title (<code>null</code> permitted).
257         * @param dataset  the dataset for the chart (<code>null</code> permitted).
258         * @param legend  a flag specifying whether or not a legend is required.
259         * @param tooltips  configure chart to generate tool tips?
260         * @param urls  configure chart to generate URLs?
261         *
262         * @return A pie chart.
263         */
264        public static JFreeChart createPieChart(String title,
265                                                PieDataset dataset,
266                                                boolean legend,
267                                                boolean tooltips,
268                                                boolean urls) {
269    
270            PiePlot plot = new PiePlot(dataset);
271            plot.setLabelGenerator(new StandardPieSectionLabelGenerator());
272            plot.setInsets(new RectangleInsets(0.0, 5.0, 5.0, 5.0));
273            if (tooltips) {
274                plot.setToolTipGenerator(new StandardPieToolTipGenerator());
275            }
276            if (urls) {
277                plot.setURLGenerator(new StandardPieURLGenerator());
278            }
279            return new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT, plot, 
280                    legend);
281    
282        }
283    
284        /**
285         * Creates a pie chart with default settings that compares 2 datasets.  
286         * The colour of each section will be determined by the move from the value
287         * for the same key in <code>previousDataset</code>. ie if value1 > value2 
288         * then the section will be in green (unless <code>greenForIncrease</code> 
289         * is <code>false</code>, in which case it would be <code>red</code>).  
290         * Each section can have a shade of red or green as the difference can be 
291         * tailored between 0% (black) and percentDiffForMaxScale% (bright 
292         * red/green).
293         * <p>
294         * For instance if <code>percentDiffForMaxScale</code> is 10 (10%), a 
295         * difference of 5% will have a half shade of red/green, a difference of 
296         * 10% or more will have a maximum shade/brightness of red/green.
297         * <P>
298         * The chart object returned by this method uses a {@link PiePlot} instance
299         * as the plot.
300         * <p>
301         * Written by <a href="mailto:opensource@objectlab.co.uk">Benoit 
302         * Xhenseval</a>.
303         *
304         * @param title  the chart title (<code>null</code> permitted).
305         * @param dataset  the dataset for the chart (<code>null</code> permitted).
306         * @param previousDataset  the dataset for the last run, this will be used 
307         *                         to compare each key in the dataset
308         * @param percentDiffForMaxScale scale goes from bright red/green to black,
309         *                               percentDiffForMaxScale indicate the change 
310         *                               required to reach top scale.
311         * @param greenForIncrease  an increase since previousDataset will be 
312         *                          displayed in green (decrease red) if true.
313         * @param legend  a flag specifying whether or not a legend is required.
314         * @param tooltips  configure chart to generate tool tips?
315         * @param locale  the locale (<code>null</code> not permitted).
316         * @param subTitle displays a subtitle with colour scheme if true
317         * @param showDifference  create a new dataset that will show the % 
318         *                        difference between the two datasets. 
319         *
320         * @return A pie chart.
321         * 
322         * @since 1.0.7
323         */
324        public static JFreeChart createPieChart(String title, PieDataset dataset,
325                PieDataset previousDataset, int percentDiffForMaxScale,
326                boolean greenForIncrease, boolean legend, boolean tooltips,
327                Locale locale, boolean subTitle, boolean showDifference) {
328    
329            PiePlot plot = new PiePlot(dataset);
330            plot.setLabelGenerator(new StandardPieSectionLabelGenerator(locale));
331            plot.setInsets(new RectangleInsets(0.0, 5.0, 5.0, 5.0));
332    
333            if (tooltips) {
334                plot.setToolTipGenerator(new StandardPieToolTipGenerator(locale));
335            }
336    
337            List keys = dataset.getKeys();
338            DefaultPieDataset series = null;
339            if (showDifference) {
340                series = new DefaultPieDataset();
341            }
342    
343            double colorPerPercent = 255.0 / percentDiffForMaxScale;
344            for (Iterator it = keys.iterator(); it.hasNext();) {
345                Comparable key = (Comparable) it.next();
346                Number newValue = dataset.getValue(key);
347                Number oldValue = previousDataset.getValue(key);
348    
349                if (oldValue == null) {
350                    if (greenForIncrease) {
351                        plot.setSectionPaint(key, Color.green);
352                    } 
353                    else {
354                        plot.setSectionPaint(key, Color.red);
355                    }
356                    if (showDifference) {
357                        series.setValue(key + " (+100%)", newValue);
358                    }
359                }
360                else {
361                    double percentChange = (newValue.doubleValue() 
362                            / oldValue.doubleValue() - 1.0) * 100.0;
363                    double shade
364                        = (Math.abs(percentChange) >= percentDiffForMaxScale ? 255
365                        : Math.abs(percentChange) * colorPerPercent);
366                    if (greenForIncrease 
367                            && newValue.doubleValue() > oldValue.doubleValue()
368                            || !greenForIncrease && newValue.doubleValue() 
369                            < oldValue.doubleValue()) {
370                        plot.setSectionPaint(key, new Color(0, (int) shade, 0));
371                    }
372                    else {
373                        plot.setSectionPaint(key, new Color((int) shade, 0, 0));
374                    }
375                    if (showDifference) {
376                        series.setValue(key + " (" + (percentChange >= 0 ? "+" : "")
377                                + NumberFormat.getPercentInstance().format(
378                                percentChange / 100.0) + ")", newValue);
379                    }
380                }
381            }
382    
383            if (showDifference) {
384                plot.setDataset(series);
385            }
386    
387            JFreeChart chart =  new JFreeChart(title, 
388                    JFreeChart.DEFAULT_TITLE_FONT, plot, legend);
389    
390            if (subTitle) {
391                TextTitle subtitle = null;
392                subtitle = new TextTitle("Bright " + (greenForIncrease ? "red" 
393                        : "green") + "=change >=-" + percentDiffForMaxScale 
394                        + "%, Bright " + (!greenForIncrease ? "red" : "green") 
395                        + "=change >=+" + percentDiffForMaxScale + "%", 
396                        new Font("SansSerif", Font.PLAIN, 10));
397                chart.addSubtitle(subtitle);
398            }
399    
400            return chart;
401        }
402    
403        /**
404         * Creates a pie chart with default settings that compares 2 datasets.  
405         * The colour of each section will be determined by the move from the value
406         * for the same key in <code>previousDataset</code>. ie if value1 > value2 
407         * then the section will be in green (unless <code>greenForIncrease</code> 
408         * is <code>false</code>, in which case it would be <code>red</code>).  
409         * Each section can have a shade of red or green as the difference can be 
410         * tailored between 0% (black) and percentDiffForMaxScale% (bright 
411         * red/green).
412         * <p>
413         * For instance if <code>percentDiffForMaxScale</code> is 10 (10%), a 
414         * difference of 5% will have a half shade of red/green, a difference of 
415         * 10% or more will have a maximum shade/brightness of red/green.
416         * <P>
417         * The chart object returned by this method uses a {@link PiePlot} instance
418         * as the plot.
419         * <p>
420         * Written by <a href="mailto:opensource@objectlab.co.uk">Benoit 
421         * Xhenseval</a>.
422         *
423         * @param title  the chart title (<code>null</code> permitted).
424         * @param dataset  the dataset for the chart (<code>null</code> permitted).
425         * @param previousDataset  the dataset for the last run, this will be used 
426         *                         to compare each key in the dataset
427         * @param percentDiffForMaxScale scale goes from bright red/green to black,
428         *                               percentDiffForMaxScale indicate the change 
429         *                               required to reach top scale.
430         * @param greenForIncrease  an increase since previousDataset will be 
431         *                          displayed in green (decrease red) if true.
432         * @param legend  a flag specifying whether or not a legend is required.
433         * @param tooltips  configure chart to generate tool tips?
434         * @param urls  configure chart to generate URLs?
435         * @param subTitle displays a subtitle with colour scheme if true
436         * @param showDifference  create a new dataset that will show the % 
437         *                        difference between the two datasets. 
438         *
439         * @return A pie chart.
440         */
441        public static JFreeChart createPieChart(String title,
442                                                PieDataset dataset,
443                                                PieDataset previousDataset,
444                                                int percentDiffForMaxScale,
445                                                boolean greenForIncrease,
446                                                boolean legend,
447                                                boolean tooltips,
448                                                boolean urls,
449                                                boolean subTitle,
450                                                boolean showDifference) {
451    
452            PiePlot plot = new PiePlot(dataset);
453            plot.setLabelGenerator(new StandardPieSectionLabelGenerator());
454            plot.setInsets(new RectangleInsets(0.0, 5.0, 5.0, 5.0));
455    
456            if (tooltips) {
457                plot.setToolTipGenerator(new StandardPieToolTipGenerator());
458            }
459            if (urls) {
460                plot.setURLGenerator(new StandardPieURLGenerator());
461            }
462    
463            List keys = dataset.getKeys();
464            DefaultPieDataset series = null;
465            if (showDifference) {
466                series = new DefaultPieDataset();
467            }
468    
469            double colorPerPercent = 255.0 / percentDiffForMaxScale;
470            for (Iterator it = keys.iterator(); it.hasNext();) {
471                Comparable key = (Comparable) it.next();
472                Number newValue = dataset.getValue(key);
473                Number oldValue = previousDataset.getValue(key);
474    
475                if (oldValue == null) {
476                    if (greenForIncrease) {
477                        plot.setSectionPaint(key, Color.green);
478                    } 
479                    else {
480                        plot.setSectionPaint(key, Color.red);
481                    }
482                    if (showDifference) {
483                        series.setValue(key + " (+100%)", newValue);
484                    }
485                }
486                else {
487                    double percentChange = (newValue.doubleValue() 
488                            / oldValue.doubleValue() - 1.0) * 100.0;
489                    double shade
490                        = (Math.abs(percentChange) >= percentDiffForMaxScale ? 255
491                        : Math.abs(percentChange) * colorPerPercent);
492                    if (greenForIncrease 
493                            && newValue.doubleValue() > oldValue.doubleValue()
494                            || !greenForIncrease && newValue.doubleValue() 
495                            < oldValue.doubleValue()) {
496                        plot.setSectionPaint(key, new Color(0, (int) shade, 0));
497                    }
498                    else {
499                        plot.setSectionPaint(key, new Color((int) shade, 0, 0));
500                    }
501                    if (showDifference) {
502                        series.setValue(key + " (" + (percentChange >= 0 ? "+" : "")
503                                + NumberFormat.getPercentInstance().format(
504                                percentChange / 100.0) + ")", newValue);
505                    }
506                }
507            }
508    
509            if (showDifference) {
510                plot.setDataset(series);
511            }
512    
513            JFreeChart chart =  new JFreeChart(title, 
514                    JFreeChart.DEFAULT_TITLE_FONT, plot, legend);
515    
516            if (subTitle) {
517                TextTitle subtitle = null;
518                subtitle = new TextTitle("Bright " + (greenForIncrease ? "red" 
519                        : "green") + "=change >=-" + percentDiffForMaxScale 
520                        + "%, Bright " + (!greenForIncrease ? "red" : "green") 
521                        + "=change >=+" + percentDiffForMaxScale + "%", 
522                        new Font("SansSerif", Font.PLAIN, 10));
523                chart.addSubtitle(subtitle);
524            }
525    
526            return chart;
527        }
528    
529        /**
530         * Creates a ring chart with default settings.
531         * <P>
532         * The chart object returned by this method uses a {@link RingPlot} 
533         * instance as the plot.
534         *
535         * @param title  the chart title (<code>null</code> permitted).
536         * @param dataset  the dataset for the chart (<code>null</code> permitted).
537         * @param legend  a flag specifying whether or not a legend is required.
538         * @param tooltips  configure chart to generate tool tips?
539         * @param locale  the locale (<code>null</code> not permitted).
540         *
541         * @return A ring chart.
542         * 
543         * @since 1.0.7
544         */
545        public static JFreeChart createRingChart(String title, PieDataset dataset,
546                boolean legend, boolean tooltips, Locale locale) {
547    
548            RingPlot plot = new RingPlot(dataset);
549            plot.setLabelGenerator(new StandardPieSectionLabelGenerator(locale));
550            plot.setInsets(new RectangleInsets(0.0, 5.0, 5.0, 5.0));
551            if (tooltips) {
552                plot.setToolTipGenerator(new StandardPieToolTipGenerator(locale));
553            }
554            return new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT, plot, 
555                    legend);
556    
557        }
558    
559        /**
560         * Creates a ring chart with default settings.
561         * <P>
562         * The chart object returned by this method uses a {@link RingPlot} 
563         * instance as the plot.
564         *
565         * @param title  the chart title (<code>null</code> permitted).
566         * @param dataset  the dataset for the chart (<code>null</code> permitted).
567         * @param legend  a flag specifying whether or not a legend is required.
568         * @param tooltips  configure chart to generate tool tips?
569         * @param urls  configure chart to generate URLs?
570         *
571         * @return A ring chart.
572         */
573        public static JFreeChart createRingChart(String title,
574                                                 PieDataset dataset,
575                                                 boolean legend,
576                                                 boolean tooltips,
577                                                 boolean urls) {
578    
579            RingPlot plot = new RingPlot(dataset);
580            plot.setLabelGenerator(new StandardPieSectionLabelGenerator());
581            plot.setInsets(new RectangleInsets(0.0, 5.0, 5.0, 5.0));
582            if (tooltips) {
583                plot.setToolTipGenerator(new StandardPieToolTipGenerator());
584            }
585            if (urls) {
586                plot.setURLGenerator(new StandardPieURLGenerator());
587            }
588            return new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT, plot, 
589                    legend);
590    
591        }
592    
593        /**
594         * Creates a chart that displays multiple pie plots.  The chart object 
595         * returned by this method uses a {@link MultiplePiePlot} instance as the
596         * plot.
597         *
598         * @param title  the chart title (<code>null</code> permitted).
599         * @param dataset  the dataset (<code>null</code> permitted).
600         * @param order  the order that the data is extracted (by row or by column)
601         *               (<code>null</code> not permitted).
602         * @param legend  include a legend?
603         * @param tooltips  generate tooltips?
604         * @param urls  generate URLs?
605         *
606         * @return A chart.
607         */
608        public static JFreeChart createMultiplePieChart(String title,
609                                                        CategoryDataset dataset,
610                                                        TableOrder order,
611                                                        boolean legend,
612                                                        boolean tooltips,
613                                                        boolean urls) {
614    
615            if (order == null) {
616                throw new IllegalArgumentException("Null 'order' argument.");
617            }
618            MultiplePiePlot plot = new MultiplePiePlot(dataset);
619            plot.setDataExtractOrder(order);
620            plot.setBackgroundPaint(null);
621            plot.setOutlineStroke(null);
622    
623            if (tooltips) {
624                PieToolTipGenerator tooltipGenerator 
625                    = new StandardPieToolTipGenerator();
626                PiePlot pp = (PiePlot) plot.getPieChart().getPlot();
627                pp.setToolTipGenerator(tooltipGenerator);
628            }
629    
630            if (urls) {
631                PieURLGenerator urlGenerator = new StandardPieURLGenerator();
632                PiePlot pp = (PiePlot) plot.getPieChart().getPlot();
633                pp.setURLGenerator(urlGenerator);
634            }
635    
636            JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT,
637                    plot, legend);
638    
639            return chart;
640    
641        }
642    
643        /**
644         * Creates a 3D pie chart using the specified dataset.  The chart object 
645         * returned by this method uses a {@link PiePlot3D} instance as the
646         * plot.
647         *
648         * @param title  the chart title (<code>null</code> permitted).
649         * @param dataset  the dataset for the chart (<code>null</code> permitted).
650         * @param legend  a flag specifying whether or not a legend is required.
651         * @param tooltips  configure chart to generate tool tips?
652         * @param locale  the locale (<code>null</code> not permitted).
653         *
654         * @return A pie chart.
655         * 
656         * @since 1.0.7
657         */
658        public static JFreeChart createPieChart3D(String title, PieDataset dataset,
659                boolean legend, boolean tooltips, Locale locale) {
660    
661            PiePlot3D plot = new PiePlot3D(dataset);
662            plot.setInsets(new RectangleInsets(0.0, 5.0, 5.0, 5.0));
663            if (tooltips) {
664                plot.setToolTipGenerator(new StandardPieToolTipGenerator(locale));
665            }
666            return new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT, plot, 
667                    legend);
668    
669        }
670    
671        /**
672         * Creates a 3D pie chart using the specified dataset.  The chart object 
673         * returned by this method uses a {@link PiePlot3D} instance as the
674         * plot.
675         *
676         * @param title  the chart title (<code>null</code> permitted).
677         * @param dataset  the dataset for the chart (<code>null</code> permitted).
678         * @param legend  a flag specifying whether or not a legend is required.
679         * @param tooltips  configure chart to generate tool tips?
680         * @param urls  configure chart to generate URLs?
681         *
682         * @return A pie chart.
683         */
684        public static JFreeChart createPieChart3D(String title,
685                                                  PieDataset dataset,
686                                                  boolean legend,
687                                                  boolean tooltips,
688                                                  boolean urls) {
689    
690            PiePlot3D plot = new PiePlot3D(dataset);
691            plot.setInsets(new RectangleInsets(0.0, 5.0, 5.0, 5.0));
692            if (tooltips) {
693                plot.setToolTipGenerator(new StandardPieToolTipGenerator());
694            }
695            if (urls) {
696                plot.setURLGenerator(new StandardPieURLGenerator());
697            }
698            return new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT, plot, 
699                    legend);
700    
701        }
702    
703        /**
704         * Creates a chart that displays multiple pie plots.  The chart object 
705         * returned by this method uses a {@link MultiplePiePlot} instance as the
706         * plot.
707         *
708         * @param title  the chart title (<code>null</code> permitted).
709         * @param dataset  the dataset (<code>null</code> permitted).
710         * @param order  the order that the data is extracted (by row or by column) 
711         *               (<code>null</code> not permitted).
712         * @param legend  include a legend?
713         * @param tooltips  generate tooltips?
714         * @param urls  generate URLs?
715         *
716         * @return A chart.
717         */
718        public static JFreeChart createMultiplePieChart3D(String title,
719                                                          CategoryDataset dataset,
720                                                          TableOrder order,
721                                                          boolean legend,
722                                                          boolean tooltips,
723                                                          boolean urls) {
724    
725            if (order == null) {
726                throw new IllegalArgumentException("Null 'order' argument.");
727            }
728            MultiplePiePlot plot = new MultiplePiePlot(dataset);
729            plot.setDataExtractOrder(order);
730            plot.setBackgroundPaint(null);
731            plot.setOutlineStroke(null);
732    
733            JFreeChart pieChart = new JFreeChart(new PiePlot3D(null));
734            TextTitle seriesTitle = new TextTitle("Series Title", 
735                    new Font("SansSerif", Font.BOLD, 12));
736            seriesTitle.setPosition(RectangleEdge.BOTTOM);
737            pieChart.setTitle(seriesTitle);
738            pieChart.removeLegend();
739            pieChart.setBackgroundPaint(null);
740            plot.setPieChart(pieChart);
741    
742            if (tooltips) {
743                PieToolTipGenerator tooltipGenerator 
744                    = new StandardPieToolTipGenerator();
745                PiePlot pp = (PiePlot) plot.getPieChart().getPlot();
746                pp.setToolTipGenerator(tooltipGenerator);
747            }
748    
749            if (urls) {
750                PieURLGenerator urlGenerator = new StandardPieURLGenerator();
751                PiePlot pp = (PiePlot) plot.getPieChart().getPlot();
752                pp.setURLGenerator(urlGenerator);
753            }
754    
755            JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT,
756                    plot, legend);
757    
758            return chart;
759    
760        }
761    
762        /**
763         * Creates a bar chart.  The chart object returned by this method uses a 
764         * {@link CategoryPlot} instance as the plot, with a {@link CategoryAxis} 
765         * for the domain axis, a {@link NumberAxis} as the range axis, and a 
766         * {@link BarRenderer} as the renderer.
767         *
768         * @param title  the chart title (<code>null</code> permitted).
769         * @param categoryAxisLabel  the label for the category axis 
770         *                           (<code>null</code> permitted).
771         * @param valueAxisLabel  the label for the value axis 
772         *                        (<code>null</code> permitted).
773         * @param dataset  the dataset for the chart (<code>null</code> permitted).
774         * @param orientation  the plot orientation (horizontal or vertical) 
775         *                     (<code>null</code> not permitted).
776         * @param legend  a flag specifying whether or not a legend is required.
777         * @param tooltips  configure chart to generate tool tips?
778         * @param urls  configure chart to generate URLs?
779         *
780         * @return A bar chart.
781         */
782        public static JFreeChart createBarChart(String title,
783                                                String categoryAxisLabel,
784                                                String valueAxisLabel,
785                                                CategoryDataset dataset,
786                                                PlotOrientation orientation,
787                                                boolean legend,
788                                                boolean tooltips,
789                                                boolean urls) {
790    
791            if (orientation == null) {
792                throw new IllegalArgumentException("Null 'orientation' argument.");
793            }
794            CategoryAxis categoryAxis = new CategoryAxis(categoryAxisLabel);
795            ValueAxis valueAxis = new NumberAxis(valueAxisLabel);
796    
797            BarRenderer renderer = new BarRenderer();
798            if (orientation == PlotOrientation.HORIZONTAL) {
799                ItemLabelPosition position1 = new ItemLabelPosition(
800                        ItemLabelAnchor.OUTSIDE3, TextAnchor.CENTER_LEFT);
801                renderer.setBasePositiveItemLabelPosition(position1);
802                ItemLabelPosition position2 = new ItemLabelPosition(
803                        ItemLabelAnchor.OUTSIDE9, TextAnchor.CENTER_RIGHT);
804                renderer.setBaseNegativeItemLabelPosition(position2);
805             }
806            else if (orientation == PlotOrientation.VERTICAL) {
807                ItemLabelPosition position1 = new ItemLabelPosition(
808                        ItemLabelAnchor.OUTSIDE12, TextAnchor.BOTTOM_CENTER);
809                renderer.setBasePositiveItemLabelPosition(position1);
810                ItemLabelPosition position2 = new ItemLabelPosition(
811                        ItemLabelAnchor.OUTSIDE6, TextAnchor.TOP_CENTER);
812                renderer.setBaseNegativeItemLabelPosition(position2);
813            }
814            if (tooltips) {
815                renderer.setBaseToolTipGenerator(
816                        new StandardCategoryToolTipGenerator());
817            }
818            if (urls) {
819                renderer.setBaseItemURLGenerator(
820                        new StandardCategoryURLGenerator());
821            }
822    
823            CategoryPlot plot = new CategoryPlot(dataset, categoryAxis, valueAxis, 
824                    renderer);
825            plot.setOrientation(orientation);
826            JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT,
827                    plot, legend);
828    
829            return chart;
830    
831        }
832    
833        /**
834         * Creates a stacked bar chart with default settings.  The chart object 
835         * returned by this method uses a {@link CategoryPlot} instance as the
836         * plot, with a {@link CategoryAxis} for the domain axis, a 
837         * {@link NumberAxis} as the range axis, and a {@link StackedBarRenderer} 
838         * as the renderer.
839         *
840         * @param title  the chart title (<code>null</code> permitted).
841         * @param domainAxisLabel  the label for the category axis 
842         *                         (<code>null</code> permitted).
843         * @param rangeAxisLabel  the label for the value axis 
844         *                        (<code>null</code> permitted).
845         * @param dataset  the dataset for the chart (<code>null</code> permitted).
846         * @param orientation  the orientation of the chart (horizontal or 
847         *                     vertical) (<code>null</code> not permitted).
848         * @param legend  a flag specifying whether or not a legend is required.
849         * @param tooltips  configure chart to generate tool tips?
850         * @param urls  configure chart to generate URLs?
851         *
852         * @return A stacked bar chart.
853         */
854        public static JFreeChart createStackedBarChart(String title,
855                                                       String domainAxisLabel,
856                                                       String rangeAxisLabel,
857                                                       CategoryDataset dataset,
858                                                       PlotOrientation orientation,
859                                                       boolean legend,
860                                                       boolean tooltips,
861                                                       boolean urls) {
862    
863            if (orientation == null) {
864                throw new IllegalArgumentException("Null 'orientation' argument.");
865            }
866    
867            CategoryAxis categoryAxis = new CategoryAxis(domainAxisLabel);
868            ValueAxis valueAxis = new NumberAxis(rangeAxisLabel);
869    
870            StackedBarRenderer renderer = new StackedBarRenderer();
871            if (tooltips) {
872                renderer.setBaseToolTipGenerator(
873                        new StandardCategoryToolTipGenerator());
874            }
875            if (urls) {
876                renderer.setBaseItemURLGenerator(
877                        new StandardCategoryURLGenerator());
878            }
879    
880            CategoryPlot plot = new CategoryPlot(dataset, categoryAxis, valueAxis, 
881                    renderer);
882            plot.setOrientation(orientation);
883            JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT,
884                    plot, legend);
885    
886            return chart;
887    
888        }
889    
890        /**
891         * Creates a bar chart with a 3D effect. The chart object returned by this 
892         * method uses a {@link CategoryPlot} instance as the plot, with a 
893         * {@link CategoryAxis3D} for the domain axis, a {@link NumberAxis3D} as 
894         * the range axis, and a {@link BarRenderer3D} as the renderer.
895         *
896         * @param title  the chart title (<code>null</code> permitted).
897         * @param categoryAxisLabel  the label for the category axis 
898         *                           (<code>null</code> permitted).
899         * @param valueAxisLabel  the label for the value axis (<code>null</code> 
900         *                        permitted).
901         * @param dataset  the dataset for the chart (<code>null</code> permitted).
902         * @param orientation  the plot orientation (horizontal or vertical) 
903         *                     (<code>null</code> not permitted).
904         * @param legend  a flag specifying whether or not a legend is required.
905         * @param tooltips  configure chart to generate tool tips?
906         * @param urls  configure chart to generate URLs?
907         *
908         * @return A bar chart with a 3D effect.
909         */
910        public static JFreeChart createBarChart3D(String title,
911                                                  String categoryAxisLabel,
912                                                  String valueAxisLabel,
913                                                  CategoryDataset dataset,
914                                                  PlotOrientation orientation,
915                                                  boolean legend,
916                                                  boolean tooltips,
917                                                  boolean urls) {
918    
919            if (orientation == null) {
920                throw new IllegalArgumentException("Null 'orientation' argument.");
921            }
922            CategoryAxis categoryAxis = new CategoryAxis3D(categoryAxisLabel);
923            ValueAxis valueAxis = new NumberAxis3D(valueAxisLabel);
924    
925            BarRenderer3D renderer = new BarRenderer3D();
926            if (tooltips) {
927                renderer.setBaseToolTipGenerator(
928                        new StandardCategoryToolTipGenerator());
929            }
930            if (urls) {
931                renderer.setBaseItemURLGenerator(
932                        new StandardCategoryURLGenerator());
933            }
934    
935            CategoryPlot plot = new CategoryPlot(dataset, categoryAxis, valueAxis, 
936                    renderer);
937            plot.setOrientation(orientation);
938            if (orientation == PlotOrientation.HORIZONTAL) {
939                // change rendering order to ensure that bar overlapping is the 
940                // right way around
941                plot.setRowRenderingOrder(SortOrder.DESCENDING);
942                plot.setColumnRenderingOrder(SortOrder.DESCENDING);
943            }
944            plot.setForegroundAlpha(0.75f);
945    
946            JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT,
947                    plot, legend);
948    
949            return chart;
950    
951        }
952    
953        /**
954         * Creates a stacked bar chart with a 3D effect and default settings. The 
955         * chart object returned by this method uses a {@link CategoryPlot} 
956         * instance as the plot, with a {@link CategoryAxis3D} for the domain axis, 
957         * a {@link NumberAxis3D} as the range axis, and a 
958         * {@link StackedBarRenderer3D} as the renderer.
959         *
960         * @param title  the chart title (<code>null</code> permitted).
961         * @param categoryAxisLabel  the label for the category axis 
962         *                           (<code>null</code> permitted).
963         * @param valueAxisLabel  the label for the value axis (<code>null</code> 
964         *                        permitted).
965         * @param dataset  the dataset for the chart (<code>null</code> permitted).
966         * @param orientation  the orientation (horizontal or vertical) 
967         *                     (<code>null</code> not permitted).
968         * @param legend  a flag specifying whether or not a legend is required.
969         * @param tooltips  configure chart to generate tool tips?
970         * @param urls  configure chart to generate URLs?
971         *
972         * @return A stacked bar chart with a 3D effect.
973         */
974        public static JFreeChart createStackedBarChart3D(String title,
975                                                        String categoryAxisLabel,
976                                                        String valueAxisLabel,
977                                                        CategoryDataset dataset,
978                                                        PlotOrientation orientation,
979                                                        boolean legend,
980                                                        boolean tooltips,
981                                                        boolean urls) {
982    
983            if (orientation == null) {
984                throw new IllegalArgumentException("Null 'orientation' argument.");
985            }
986            CategoryAxis categoryAxis = new CategoryAxis3D(categoryAxisLabel);
987            ValueAxis valueAxis = new NumberAxis3D(valueAxisLabel);
988    
989            // create the renderer...
990            CategoryItemRenderer renderer = new StackedBarRenderer3D();
991            if (tooltips) {
992                renderer.setBaseToolTipGenerator(
993                        new StandardCategoryToolTipGenerator());
994            }
995            if (urls) {
996                renderer.setBaseItemURLGenerator(
997                        new StandardCategoryURLGenerator());
998            }
999    
1000            // create the plot...
1001            CategoryPlot plot = new CategoryPlot(dataset, categoryAxis, valueAxis, 
1002                    renderer);
1003            plot.setOrientation(orientation);
1004            if (orientation == PlotOrientation.HORIZONTAL) {
1005                // change rendering order to ensure that bar overlapping is the 
1006                // right way around
1007                plot.setColumnRenderingOrder(SortOrder.DESCENDING);
1008            }
1009    
1010            // create the chart...
1011            JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT, 
1012                    plot, legend);
1013    
1014            return chart;
1015    
1016        }
1017    
1018        /**
1019         * Creates an area chart with default settings.  The chart object returned
1020         * by this method uses a {@link CategoryPlot} instance as the plot, with a 
1021         * {@link CategoryAxis} for the domain axis, a {@link NumberAxis} as the
1022         * range axis, and an {@link AreaRenderer} as the renderer.
1023         *
1024         * @param title  the chart title (<code>null</code> permitted).
1025         * @param categoryAxisLabel  the label for the category axis 
1026         *                           (<code>null</code> permitted).
1027         * @param valueAxisLabel  the label for the value axis (<code>null</code> 
1028         *                        permitted).
1029         * @param dataset  the dataset for the chart (<code>null</code> permitted).
1030         * @param orientation  the plot orientation (<code>null</code> not 
1031         *                     permitted).
1032         * @param legend  a flag specifying whether or not a legend is required.
1033         * @param tooltips  configure chart to generate tool tips?
1034         * @param urls  configure chart to generate URLs?
1035         *
1036         * @return An area chart.
1037         */
1038        public static JFreeChart createAreaChart(String title,
1039                                                 String categoryAxisLabel,
1040                                                 String valueAxisLabel,
1041                                                 CategoryDataset dataset,
1042                                                 PlotOrientation orientation,
1043                                                 boolean legend,
1044                                                 boolean tooltips,
1045                                                 boolean urls) {
1046    
1047            if (orientation == null) {
1048                throw new IllegalArgumentException("Null 'orientation' argument.");
1049            }
1050            CategoryAxis categoryAxis = new CategoryAxis(categoryAxisLabel);
1051            categoryAxis.setCategoryMargin(0.0);
1052    
1053            ValueAxis valueAxis = new NumberAxis(valueAxisLabel);
1054    
1055            AreaRenderer renderer = new AreaRenderer();
1056            if (tooltips) {
1057                renderer.setBaseToolTipGenerator(
1058                        new StandardCategoryToolTipGenerator());
1059            }
1060            if (urls) {
1061                renderer.setBaseItemURLGenerator(
1062                        new StandardCategoryURLGenerator());
1063            }
1064    
1065            CategoryPlot plot = new CategoryPlot(dataset, categoryAxis, valueAxis, 
1066                    renderer);
1067            plot.setOrientation(orientation);
1068            JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT,
1069                    plot, legend);
1070    
1071            return chart;
1072    
1073        }
1074    
1075        /**
1076         * Creates a stacked area chart with default settings.  The chart object 
1077         * returned by this method uses a {@link CategoryPlot} instance as the
1078         * plot, with a {@link CategoryAxis} for the domain axis, a 
1079         * {@link NumberAxis} as the range axis, and a {@link StackedAreaRenderer} 
1080         * as the renderer.
1081         *
1082         * @param title  the chart title (<code>null</code> permitted).
1083         * @param categoryAxisLabel  the label for the category axis 
1084         *                           (<code>null</code> permitted).
1085         * @param valueAxisLabel  the label for the value axis (<code>null</code> 
1086         *                        permitted).
1087         * @param dataset  the dataset for the chart (<code>null</code> permitted).
1088         * @param orientation  the plot orientation (horizontal or vertical) 
1089         *                     (<code>null</code> not permitted).
1090         * @param legend  a flag specifying whether or not a legend is required.
1091         * @param tooltips  configure chart to generate tool tips?
1092         * @param urls  configure chart to generate URLs?
1093         *
1094         * @return A stacked area chart.
1095         */
1096        public static JFreeChart createStackedAreaChart(String title,
1097                                                        String categoryAxisLabel,
1098                                                        String valueAxisLabel,
1099                                                        CategoryDataset dataset,
1100                                                        PlotOrientation orientation,
1101                                                        boolean legend,
1102                                                        boolean tooltips,
1103                                                        boolean urls) {
1104    
1105            if (orientation == null) {
1106                throw new IllegalArgumentException("Null 'orientation' argument.");
1107            }
1108            CategoryAxis categoryAxis = new CategoryAxis(categoryAxisLabel);
1109            ValueAxis valueAxis = new NumberAxis(valueAxisLabel);
1110    
1111            StackedAreaRenderer renderer = new StackedAreaRenderer();
1112            if (tooltips) {
1113                renderer.setBaseToolTipGenerator(
1114                        new StandardCategoryToolTipGenerator());
1115            }
1116            if (urls) {
1117                renderer.setBaseItemURLGenerator(
1118                        new StandardCategoryURLGenerator());
1119            }
1120    
1121            CategoryPlot plot = new CategoryPlot(dataset, categoryAxis, valueAxis, 
1122                    renderer);
1123            plot.setOrientation(orientation);
1124            JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT, 
1125                    plot, legend);
1126    
1127            return chart;
1128    
1129        }
1130    
1131        /**
1132         * Creates a line chart with default settings.  The chart object returned 
1133         * by this method uses a {@link CategoryPlot} instance as the plot, with a 
1134         * {@link CategoryAxis} for the domain axis, a {@link NumberAxis} as the 
1135         * range axis, and a {@link LineAndShapeRenderer} as the renderer.
1136         *
1137         * @param title  the chart title (<code>null</code> permitted).
1138         * @param categoryAxisLabel  the label for the category axis 
1139         *                           (<code>null</code> permitted).
1140         * @param valueAxisLabel  the label for the value axis (<code>null</code> 
1141         *                        permitted).
1142         * @param dataset  the dataset for the chart (<code>null</code> permitted).
1143         * @param orientation  the chart orientation (horizontal or vertical) 
1144         *                     (<code>null</code> not permitted).
1145         * @param legend  a flag specifying whether or not a legend is required.
1146         * @param tooltips  configure chart to generate tool tips?
1147         * @param urls  configure chart to generate URLs?
1148         *
1149         * @return A line chart.
1150         */
1151        public static JFreeChart createLineChart(String title,
1152                                                 String categoryAxisLabel,
1153                                                 String valueAxisLabel,
1154                                                 CategoryDataset dataset,
1155                                                 PlotOrientation orientation,
1156                                                 boolean legend,
1157                                                 boolean tooltips,
1158                                                 boolean urls) {
1159    
1160            if (orientation == null) {
1161                throw new IllegalArgumentException("Null 'orientation' argument.");
1162            }
1163            CategoryAxis categoryAxis = new CategoryAxis(categoryAxisLabel);
1164            ValueAxis valueAxis = new NumberAxis(valueAxisLabel);
1165    
1166            LineAndShapeRenderer renderer = new LineAndShapeRenderer(true, false);
1167            if (tooltips) {
1168                renderer.setBaseToolTipGenerator(
1169                        new StandardCategoryToolTipGenerator());
1170            }
1171            if (urls) {
1172                renderer.setBaseItemURLGenerator(
1173                        new StandardCategoryURLGenerator());
1174            }
1175            CategoryPlot plot = new CategoryPlot(dataset, categoryAxis, valueAxis, 
1176                    renderer);
1177            plot.setOrientation(orientation);
1178            JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT,
1179                    plot, legend);
1180    
1181            return chart;
1182    
1183        }
1184    
1185        /**
1186         * Creates a line chart with default settings. The chart object returned by 
1187         * this method uses a {@link CategoryPlot} instance as the plot, with a 
1188         * {@link CategoryAxis3D} for the domain axis, a {@link NumberAxis3D} as 
1189         * the range axis, and a {@link LineRenderer3D} as the renderer.
1190         *
1191         * @param title  the chart title (<code>null</code> permitted).
1192         * @param categoryAxisLabel  the label for the category axis 
1193         *                           (<code>null</code> permitted).
1194         * @param valueAxisLabel  the label for the value axis (<code>null</code> 
1195         *                        permitted).
1196         * @param dataset  the dataset for the chart (<code>null</code> permitted).
1197         * @param orientation  the chart orientation (horizontal or vertical) 
1198         *                     (<code>null</code> not permitted).
1199         * @param legend  a flag specifying whether or not a legend is required.
1200         * @param tooltips  configure chart to generate tool tips?
1201         * @param urls  configure chart to generate URLs?
1202         *
1203         * @return A line chart.
1204         */
1205        public static JFreeChart createLineChart3D(String title,
1206                                                   String categoryAxisLabel,
1207                                                   String valueAxisLabel,
1208                                                   CategoryDataset dataset,
1209                                                   PlotOrientation orientation,
1210                                                   boolean legend,
1211                                                   boolean tooltips,
1212                                                   boolean urls) {
1213    
1214            if (orientation == null) {
1215                throw new IllegalArgumentException("Null 'orientation' argument.");
1216            }
1217            CategoryAxis categoryAxis = new CategoryAxis3D(categoryAxisLabel);
1218            ValueAxis valueAxis = new NumberAxis3D(valueAxisLabel);
1219    
1220            LineRenderer3D renderer = new LineRenderer3D();
1221            if (tooltips) {
1222                renderer.setBaseToolTipGenerator(
1223                        new StandardCategoryToolTipGenerator());
1224            }
1225            if (urls) {
1226                renderer.setBaseItemURLGenerator(
1227                        new StandardCategoryURLGenerator());
1228            }
1229            CategoryPlot plot = new CategoryPlot(dataset, categoryAxis, valueAxis, 
1230                    renderer);
1231            plot.setOrientation(orientation);
1232            JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT,
1233                    plot, legend);
1234    
1235            return chart;
1236    
1237        }
1238    
1239        /**
1240         * Creates a Gantt chart using the supplied attributes plus default values 
1241         * where required.  The chart object returned by this method uses a 
1242         * {@link CategoryPlot} instance as the plot, with a {@link CategoryAxis} 
1243         * for the domain axis, a {@link DateAxis} as the range axis, and a 
1244         * {@link GanttRenderer} as the renderer.
1245         *
1246         * @param title  the chart title (<code>null</code> permitted).
1247         * @param categoryAxisLabel  the label for the category axis 
1248         *                           (<code>null</code> permitted).
1249         * @param dateAxisLabel  the label for the date axis 
1250         *                       (<code>null</code> permitted).
1251         * @param dataset  the dataset for the chart (<code>null</code> permitted).
1252         * @param legend  a flag specifying whether or not a legend is required.
1253         * @param tooltips  configure chart to generate tool tips?
1254         * @param urls  configure chart to generate URLs?
1255         *
1256         * @return A Gantt chart.
1257         */
1258        public static JFreeChart createGanttChart(String title,
1259                                                  String categoryAxisLabel,
1260                                                  String dateAxisLabel,
1261                                                  IntervalCategoryDataset dataset,
1262                                                  boolean legend,
1263                                                  boolean tooltips,
1264                                                  boolean urls) {
1265    
1266            CategoryAxis categoryAxis = new CategoryAxis(categoryAxisLabel);
1267            DateAxis dateAxis = new DateAxis(dateAxisLabel);
1268    
1269            CategoryItemRenderer renderer = new GanttRenderer();
1270            if (tooltips) {
1271                renderer.setBaseToolTipGenerator(
1272                        new IntervalCategoryToolTipGenerator(
1273                        "{3} - {4}", DateFormat.getDateInstance()));
1274            }
1275            if (urls) {
1276                renderer.setBaseItemURLGenerator(
1277                        new StandardCategoryURLGenerator());
1278            }
1279    
1280            CategoryPlot plot = new CategoryPlot(dataset, categoryAxis, dateAxis, 
1281                    renderer);
1282            plot.setOrientation(PlotOrientation.HORIZONTAL);
1283            JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT,
1284                    plot, legend);
1285    
1286            return chart;
1287    
1288        }
1289    
1290        /**
1291         * Creates a waterfall chart.  The chart object returned by this method 
1292         * uses a {@link CategoryPlot} instance as the plot, with a 
1293         * {@link CategoryAxis} for the domain axis, a {@link NumberAxis} as the
1294         * range axis, and a {@link WaterfallBarRenderer} as the renderer.
1295         *
1296         * @param title  the chart title (<code>null</code> permitted).
1297         * @param categoryAxisLabel  the label for the category axis 
1298         *                           (<code>null</code> permitted).
1299         * @param valueAxisLabel  the label for the value axis (<code>null</code> 
1300         *                        permitted).
1301         * @param dataset  the dataset for the chart (<code>null</code> permitted).
1302         * @param orientation  the plot orientation (horizontal or vertical) 
1303         *                     (<code>null</code> NOT permitted).
1304         * @param legend  a flag specifying whether or not a legend is required.
1305         * @param tooltips  configure chart to generate tool tips?
1306         * @param urls  configure chart to generate URLs?
1307         *
1308         * @return A waterfall chart.
1309         */
1310        public static JFreeChart createWaterfallChart(String title,
1311                                                      String categoryAxisLabel,
1312                                                      String valueAxisLabel,
1313                                                      CategoryDataset dataset,
1314                                                      PlotOrientation orientation,
1315                                                      boolean legend,
1316                                                      boolean tooltips,
1317                                                      boolean urls) {
1318    
1319            if (orientation == null) {
1320                throw new IllegalArgumentException("Null 'orientation' argument.");
1321            }
1322            CategoryAxis categoryAxis = new CategoryAxis(categoryAxisLabel);
1323            categoryAxis.setCategoryMargin(0.0);
1324    
1325            ValueAxis valueAxis = new NumberAxis(valueAxisLabel);
1326    
1327            WaterfallBarRenderer renderer = new WaterfallBarRenderer();
1328            if (orientation == PlotOrientation.HORIZONTAL) {
1329                ItemLabelPosition position = new ItemLabelPosition(
1330                        ItemLabelAnchor.CENTER, TextAnchor.CENTER, 
1331                        TextAnchor.CENTER, Math.PI / 2.0);
1332                renderer.setBasePositiveItemLabelPosition(position);
1333                renderer.setBaseNegativeItemLabelPosition(position);
1334             }
1335            else if (orientation == PlotOrientation.VERTICAL) {
1336                ItemLabelPosition position = new ItemLabelPosition(
1337                        ItemLabelAnchor.CENTER, TextAnchor.CENTER, 
1338                        TextAnchor.CENTER, 0.0);
1339                renderer.setBasePositiveItemLabelPosition(position);
1340                renderer.setBaseNegativeItemLabelPosition(position);
1341            }
1342            if (tooltips) {
1343                StandardCategoryToolTipGenerator generator 
1344                    = new StandardCategoryToolTipGenerator();
1345                renderer.setBaseToolTipGenerator(generator);
1346            }
1347            if (urls) {
1348                renderer.setBaseItemURLGenerator(
1349                        new StandardCategoryURLGenerator());
1350            }
1351    
1352            CategoryPlot plot = new CategoryPlot(dataset, categoryAxis, valueAxis, 
1353                    renderer);
1354            plot.clearRangeMarkers();
1355            Marker baseline = new ValueMarker(0.0);
1356            baseline.setPaint(Color.black);
1357            plot.addRangeMarker(baseline, Layer.FOREGROUND);
1358            plot.setOrientation(orientation);
1359            JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT, 
1360                    plot, legend);
1361    
1362            return chart;
1363    
1364        }
1365    
1366        /**
1367         * Creates a polar plot for the specified dataset (x-values interpreted as 
1368         * angles in degrees).  The chart object returned by this method uses a 
1369         * {@link PolarPlot} instance as the plot, with a {@link NumberAxis} for 
1370         * the radial axis.
1371         *
1372         * @param title  the chart title (<code>null</code> permitted).
1373         * @param dataset  the dataset (<code>null</code> permitted).
1374         * @param legend  legend required?
1375         * @param tooltips  tooltips required?
1376         * @param urls  URLs required?
1377         *
1378         * @return A chart.
1379         */
1380        public static JFreeChart createPolarChart(String title,
1381                                                  XYDataset dataset,
1382                                                  boolean legend,
1383                                                  boolean tooltips,
1384                                                  boolean urls) {
1385    
1386            PolarPlot plot = new PolarPlot();
1387            plot.setDataset(dataset);
1388            NumberAxis rangeAxis = new NumberAxis();
1389            rangeAxis.setAxisLineVisible(false);
1390            rangeAxis.setTickMarksVisible(false);
1391            rangeAxis.setTickLabelInsets(new RectangleInsets(0.0, 0.0, 0.0, 0.0));
1392            plot.setAxis(rangeAxis);
1393            plot.setRenderer(new DefaultPolarItemRenderer());
1394            JFreeChart chart = new JFreeChart(
1395                    title, JFreeChart.DEFAULT_TITLE_FONT, plot, legend);
1396            return chart;
1397    
1398        }
1399    
1400        /**
1401         * Creates a scatter plot with default settings.  The chart object 
1402         * returned by this method uses an {@link XYPlot} instance as the plot, 
1403         * with a {@link NumberAxis} for the domain axis, a  {@link NumberAxis} 
1404         * as the range axis, and an {@link XYLineAndShapeRenderer} as the 
1405         * renderer.
1406         *
1407         * @param title  the chart title (<code>null</code> permitted).
1408         * @param xAxisLabel  a label for the X-axis (<code>null</code> permitted).
1409         * @param yAxisLabel  a label for the Y-axis (<code>null</code> permitted).
1410         * @param dataset  the dataset for the chart (<code>null</code> permitted).
1411         * @param orientation  the plot orientation (horizontal or vertical) 
1412         *                     (<code>null</code> NOT permitted).
1413         * @param legend  a flag specifying whether or not a legend is required.
1414         * @param tooltips  configure chart to generate tool tips?
1415         * @param urls  configure chart to generate URLs?
1416         *
1417         * @return A scatter plot.
1418         */
1419        public static JFreeChart createScatterPlot(String title, String xAxisLabel,
1420                String yAxisLabel, XYDataset dataset, PlotOrientation orientation,
1421                boolean legend, boolean tooltips, boolean urls) {
1422    
1423            if (orientation == null) {
1424                throw new IllegalArgumentException("Null 'orientation' argument.");
1425            }
1426            NumberAxis xAxis = new NumberAxis(xAxisLabel);
1427            xAxis.setAutoRangeIncludesZero(false);
1428            NumberAxis yAxis = new NumberAxis(yAxisLabel);
1429            yAxis.setAutoRangeIncludesZero(false);
1430    
1431            XYPlot plot = new XYPlot(dataset, xAxis, yAxis, null);
1432    
1433            XYToolTipGenerator toolTipGenerator = null;
1434            if (tooltips) {
1435                toolTipGenerator = new StandardXYToolTipGenerator();
1436            }
1437    
1438            XYURLGenerator urlGenerator = null;
1439            if (urls) {
1440                urlGenerator = new StandardXYURLGenerator();
1441            }
1442            XYItemRenderer renderer = new XYLineAndShapeRenderer(false, true);
1443            renderer.setBaseToolTipGenerator(toolTipGenerator);
1444            renderer.setURLGenerator(urlGenerator);
1445            plot.setRenderer(renderer);
1446            plot.setOrientation(orientation);
1447    
1448            JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT,
1449                    plot, legend);
1450            return chart;
1451    
1452        }
1453    
1454        /**
1455         * Creates and returns a default instance of an XY bar chart.
1456         * <P>
1457         * The chart object returned by this method uses an {@link XYPlot} instance
1458         * as the plot, with a {@link DateAxis} for the domain axis, a 
1459         * {@link NumberAxis} as the range axis, and a {@link XYBarRenderer} as the 
1460         * renderer.
1461         *
1462         * @param title  the chart title (<code>null</code> permitted).
1463         * @param xAxisLabel  a label for the X-axis (<code>null</code> permitted).
1464         * @param dateAxis  make the domain axis display dates?
1465         * @param yAxisLabel  a label for the Y-axis (<code>null</code> permitted).
1466         * @param dataset  the dataset for the chart (<code>null</code> permitted).
1467         * @param orientation  the orientation (horizontal or vertical) 
1468         *                     (<code>null</code> NOT permitted).
1469         * @param legend  a flag specifying whether or not a legend is required.
1470         * @param tooltips  configure chart to generate tool tips?
1471         * @param urls  configure chart to generate URLs?
1472         *
1473         * @return An XY bar chart.
1474         */
1475        public static JFreeChart createXYBarChart(String title,
1476                                                  String xAxisLabel,
1477                                                  boolean dateAxis,
1478                                                  String yAxisLabel,
1479                                                  IntervalXYDataset dataset,
1480                                                  PlotOrientation orientation,
1481                                                  boolean legend,
1482                                                  boolean tooltips,
1483                                                  boolean urls) {
1484    
1485            if (orientation == null) {
1486                throw new IllegalArgumentException("Null 'orientation' argument.");
1487            }
1488            ValueAxis domainAxis = null;
1489            if (dateAxis) {
1490                domainAxis = new DateAxis(xAxisLabel);
1491            }
1492            else {
1493                NumberAxis axis = new NumberAxis(xAxisLabel);
1494                axis.setAutoRangeIncludesZero(false);
1495                domainAxis = axis;
1496            }
1497            ValueAxis valueAxis = new NumberAxis(yAxisLabel);
1498    
1499            XYBarRenderer renderer = new XYBarRenderer();
1500            if (tooltips) {
1501                XYToolTipGenerator tt;
1502                if (dateAxis) {
1503                    tt = StandardXYToolTipGenerator.getTimeSeriesInstance();
1504                }
1505                else {
1506                    tt = new StandardXYToolTipGenerator();
1507                }
1508                renderer.setBaseToolTipGenerator(tt);
1509            }
1510            if (urls) {
1511                renderer.setURLGenerator(new StandardXYURLGenerator());
1512            }
1513    
1514            XYPlot plot = new XYPlot(dataset, domainAxis, valueAxis, renderer);
1515            plot.setOrientation(orientation);
1516    
1517            JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT,
1518                    plot, legend);
1519    
1520            return chart;
1521    
1522        }
1523    
1524        /**
1525         * Creates an area chart using an {@link XYDataset}.
1526         * <P>
1527         * The chart object returned by this method uses an {@link XYPlot} instance 
1528         * as the plot, with a {@link NumberAxis} for the domain axis, a 
1529         * {@link NumberAxis} as the range axis, and a {@link XYAreaRenderer} as 
1530         * the renderer.
1531         *
1532         * @param title  the chart title (<code>null</code> permitted).
1533         * @param xAxisLabel  a label for the X-axis (<code>null</code> permitted).
1534         * @param yAxisLabel  a label for the Y-axis (<code>null</code> permitted).
1535         * @param dataset  the dataset for the chart (<code>null</code> permitted).
1536         * @param orientation  the plot orientation (horizontal or vertical) 
1537         *                     (<code>null</code> NOT permitted).
1538         * @param legend  a flag specifying whether or not a legend is required.
1539         * @param tooltips  configure chart to generate tool tips?
1540         * @param urls  configure chart to generate URLs?
1541         *
1542         * @return An XY area chart.
1543         */
1544        public static JFreeChart createXYAreaChart(String title,
1545                                                   String xAxisLabel,
1546                                                   String yAxisLabel,
1547                                                   XYDataset dataset,
1548                                                   PlotOrientation orientation,
1549                                                   boolean legend,
1550                                                   boolean tooltips,
1551                                                   boolean urls) {
1552    
1553            if (orientation == null) {
1554                throw new IllegalArgumentException("Null 'orientation' argument.");
1555            }
1556            NumberAxis xAxis = new NumberAxis(xAxisLabel);
1557            xAxis.setAutoRangeIncludesZero(false);
1558            NumberAxis yAxis = new NumberAxis(yAxisLabel);
1559            XYPlot plot = new XYPlot(dataset, xAxis, yAxis, null);
1560            plot.setOrientation(orientation);
1561            plot.setForegroundAlpha(0.5f);
1562    
1563            XYToolTipGenerator tipGenerator = null;
1564            if (tooltips) {
1565                tipGenerator = new StandardXYToolTipGenerator();
1566            }
1567    
1568            XYURLGenerator urlGenerator = null;
1569            if (urls) {
1570                urlGenerator = new StandardXYURLGenerator();
1571            }
1572    
1573            plot.setRenderer(
1574                new XYAreaRenderer(XYAreaRenderer.AREA, tipGenerator, urlGenerator)
1575            );
1576            JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT,
1577                    plot, legend);
1578    
1579            return chart;
1580    
1581        }
1582    
1583        /**
1584         * Creates a stacked XY area plot.  The chart object returned by this 
1585         * method uses an {@link XYPlot} instance as the plot, with a 
1586         * {@link NumberAxis} for the domain axis, a {@link NumberAxis} as the
1587         * range axis, and a {@link StackedXYAreaRenderer2} as the renderer.
1588         *
1589         * @param title  the chart title (<code>null</code> permitted).
1590         * @param xAxisLabel  a label for the X-axis (<code>null</code> permitted).
1591         * @param yAxisLabel  a label for the Y-axis (<code>null</code> permitted).
1592         * @param dataset  the dataset for the chart (<code>null</code> permitted).
1593         * @param orientation  the plot orientation (horizontal or vertical) 
1594         *                     (<code>null</code> NOT permitted).
1595         * @param legend  a flag specifying whether or not a legend is required.
1596         * @param tooltips  configure chart to generate tool tips?
1597         * @param urls  configure chart to generate URLs?
1598         *
1599         * @return A stacked XY area chart.
1600         */
1601        public static JFreeChart createStackedXYAreaChart(String title,
1602                                                        String xAxisLabel,
1603                                                        String yAxisLabel,
1604                                                        TableXYDataset dataset,
1605                                                        PlotOrientation orientation,
1606                                                        boolean legend,
1607                                                        boolean tooltips,
1608                                                        boolean urls) {
1609    
1610            if (orientation == null) {
1611                throw new IllegalArgumentException("Null 'orientation' argument.");
1612            }
1613            NumberAxis xAxis = new NumberAxis(xAxisLabel);
1614            xAxis.setAutoRangeIncludesZero(false);
1615            xAxis.setLowerMargin(0.0);
1616            xAxis.setUpperMargin(0.0);
1617            NumberAxis yAxis = new NumberAxis(yAxisLabel);
1618            XYToolTipGenerator toolTipGenerator = null;
1619            if (tooltips) {
1620                toolTipGenerator = new StandardXYToolTipGenerator();
1621            }
1622    
1623            XYURLGenerator urlGenerator = null;
1624            if (urls) {
1625                urlGenerator = new StandardXYURLGenerator();
1626            }
1627            StackedXYAreaRenderer2 renderer = new StackedXYAreaRenderer2(
1628                    toolTipGenerator, urlGenerator);
1629            renderer.setOutline(true);
1630            XYPlot plot = new XYPlot(dataset, xAxis, yAxis, renderer);
1631            plot.setOrientation(orientation);
1632    
1633            plot.setRangeAxis(yAxis);  // forces recalculation of the axis range
1634    
1635            JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT,
1636                    plot, legend);
1637            return chart;
1638    
1639        }
1640    
1641        /**
1642         * Creates a line chart (based on an {@link XYDataset}) with default 
1643         * settings.
1644         *
1645         * @param title  the chart title (<code>null</code> permitted).
1646         * @param xAxisLabel  a label for the X-axis (<code>null</code> permitted).
1647         * @param yAxisLabel  a label for the Y-axis (<code>null</code> permitted).
1648         * @param dataset  the dataset for the chart (<code>null</code> permitted).
1649         * @param orientation  the plot orientation (horizontal or vertical) 
1650         *                     (<code>null</code> NOT permitted).
1651         * @param legend  a flag specifying whether or not a legend is required.
1652         * @param tooltips  configure chart to generate tool tips?
1653         * @param urls  configure chart to generate URLs?
1654         *
1655         * @return The chart.
1656         */
1657        public static JFreeChart createXYLineChart(String title,
1658                                                   String xAxisLabel,
1659                                                   String yAxisLabel,
1660                                                   XYDataset dataset,
1661                                                   PlotOrientation orientation,
1662                                                   boolean legend,
1663                                                   boolean tooltips,
1664                                                   boolean urls) {
1665    
1666            if (orientation == null) {
1667                throw new IllegalArgumentException("Null 'orientation' argument.");
1668            }
1669            NumberAxis xAxis = new NumberAxis(xAxisLabel);
1670            xAxis.setAutoRangeIncludesZero(false);
1671            NumberAxis yAxis = new NumberAxis(yAxisLabel);
1672            XYItemRenderer renderer = new XYLineAndShapeRenderer(true, false);
1673            XYPlot plot = new XYPlot(dataset, xAxis, yAxis, renderer);
1674            plot.setOrientation(orientation);
1675            if (tooltips) {
1676                renderer.setBaseToolTipGenerator(new StandardXYToolTipGenerator());
1677            }
1678            if (urls) {
1679                renderer.setURLGenerator(new StandardXYURLGenerator());
1680            }
1681    
1682            JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT,
1683                    plot, legend);
1684    
1685            return chart;
1686    
1687        }
1688    
1689        /**
1690         * Creates a stepped XY plot with default settings.
1691         *
1692         * @param title  the chart title (<code>null</code> permitted).
1693         * @param xAxisLabel  a label for the X-axis (<code>null</code> permitted).
1694         * @param yAxisLabel  a label for the Y-axis (<code>null</code> permitted).
1695         * @param dataset  the dataset for the chart (<code>null</code> permitted).
1696         * @param orientation  the plot orientation (horizontal or vertical) 
1697         *                     (<code>null</code> NOT permitted).
1698         * @param legend  a flag specifying whether or not a legend is required.
1699         * @param tooltips  configure chart to generate tool tips?
1700         * @param urls  configure chart to generate URLs?
1701         *
1702         * @return A chart.
1703         */
1704        public static JFreeChart createXYStepChart(String title,
1705                                                   String xAxisLabel,
1706                                                   String yAxisLabel,
1707                                                   XYDataset dataset,
1708                                                   PlotOrientation orientation,
1709                                                   boolean legend,
1710                                                   boolean tooltips,
1711                                                   boolean urls) {
1712    
1713            if (orientation == null) {
1714                throw new IllegalArgumentException("Null 'orientation' argument.");
1715            }
1716            DateAxis xAxis = new DateAxis(xAxisLabel);
1717            NumberAxis yAxis = new NumberAxis(yAxisLabel);
1718            yAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
1719    
1720            XYToolTipGenerator toolTipGenerator = null;
1721            if (tooltips) {
1722                toolTipGenerator = new StandardXYToolTipGenerator();
1723            }
1724    
1725            XYURLGenerator urlGenerator = null;
1726            if (urls) {
1727                urlGenerator = new StandardXYURLGenerator();
1728            }
1729            XYItemRenderer renderer 
1730                = new XYStepRenderer(toolTipGenerator, urlGenerator);
1731    
1732            XYPlot plot = new XYPlot(dataset, xAxis, yAxis, null);
1733            plot.setRenderer(renderer);
1734            plot.setOrientation(orientation);
1735            plot.setDomainCrosshairVisible(false);
1736            plot.setRangeCrosshairVisible(false);
1737            JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT,
1738                    plot, legend);
1739            return chart;
1740    
1741        }
1742    
1743        /**
1744         * Creates a filled stepped XY plot with default settings.
1745         *
1746         * @param title  the chart title (<code>null</code> permitted).
1747         * @param xAxisLabel  a label for the X-axis (<code>null</code> permitted).
1748         * @param yAxisLabel  a label for the Y-axis (<code>null</code> permitted).
1749         * @param dataset  the dataset for the chart (<code>null</code> permitted).
1750         * @param orientation  the plot orientation (horizontal or vertical) 
1751         *                     (<code>null</code> NOT permitted).
1752         * @param legend  a flag specifying whether or not a legend is required.
1753         * @param tooltips  configure chart to generate tool tips?
1754         * @param urls  configure chart to generate URLs?
1755         *
1756         * @return A chart.
1757         */
1758        public static JFreeChart createXYStepAreaChart(String title,
1759                                                       String xAxisLabel,
1760                                                       String yAxisLabel,
1761                                                       XYDataset dataset,
1762                                                       PlotOrientation orientation,
1763                                                       boolean legend,
1764                                                       boolean tooltips,
1765                                                       boolean urls) {
1766    
1767            if (orientation == null) {
1768                throw new IllegalArgumentException("Null 'orientation' argument.");
1769            }
1770            NumberAxis xAxis = new NumberAxis(xAxisLabel);
1771            xAxis.setAutoRangeIncludesZero(false);
1772            NumberAxis yAxis = new NumberAxis(yAxisLabel);
1773    
1774            XYToolTipGenerator toolTipGenerator = null;
1775            if (tooltips) {
1776                toolTipGenerator = new StandardXYToolTipGenerator();
1777            }
1778    
1779            XYURLGenerator urlGenerator = null;
1780            if (urls) {
1781                urlGenerator = new StandardXYURLGenerator();
1782            }
1783            XYItemRenderer renderer = new XYStepAreaRenderer(
1784                    XYStepAreaRenderer.AREA_AND_SHAPES, toolTipGenerator, 
1785                    urlGenerator);
1786    
1787            XYPlot plot = new XYPlot(dataset, xAxis, yAxis, null);
1788            plot.setRenderer(renderer);
1789            plot.setOrientation(orientation);
1790            plot.setDomainCrosshairVisible(false);
1791            plot.setRangeCrosshairVisible(false);
1792            JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT,
1793                    plot, legend);
1794            return chart;
1795        }
1796    
1797        /**
1798         * Creates and returns a time series chart.  A time series chart is an 
1799         * {@link XYPlot} with a {@link DateAxis} for the x-axis and a 
1800         * {@link NumberAxis} for the y-axis.  The default renderer is an
1801         * {@link XYLineAndShapeRenderer}.
1802         * <P>
1803         * A convenient dataset to use with this chart is a 
1804         * {@link org.jfree.data.time.TimeSeriesCollection}.
1805         *
1806         * @param title  the chart title (<code>null</code> permitted).
1807         * @param timeAxisLabel  a label for the time axis (<code>null</code> 
1808         *                       permitted).
1809         * @param valueAxisLabel  a label for the value axis (<code>null</code> 
1810         *                        permitted).
1811         * @param dataset  the dataset for the chart (<code>null</code> permitted).
1812         * @param legend  a flag specifying whether or not a legend is required.
1813         * @param tooltips  configure chart to generate tool tips?
1814         * @param urls  configure chart to generate URLs?
1815         *
1816         * @return A time series chart.
1817         */
1818        public static JFreeChart createTimeSeriesChart(String title,
1819                                                       String timeAxisLabel,
1820                                                       String valueAxisLabel,
1821                                                       XYDataset dataset,
1822                                                       boolean legend,
1823                                                       boolean tooltips,
1824                                                       boolean urls) {
1825    
1826            ValueAxis timeAxis = new DateAxis(timeAxisLabel);
1827            timeAxis.setLowerMargin(0.02);  // reduce the default margins 
1828            timeAxis.setUpperMargin(0.02);
1829            NumberAxis valueAxis = new NumberAxis(valueAxisLabel);
1830            valueAxis.setAutoRangeIncludesZero(false);  // override default
1831            XYPlot plot = new XYPlot(dataset, timeAxis, valueAxis, null);
1832    
1833            XYToolTipGenerator toolTipGenerator = null;
1834            if (tooltips) {
1835                toolTipGenerator 
1836                    = StandardXYToolTipGenerator.getTimeSeriesInstance();
1837            }
1838    
1839            XYURLGenerator urlGenerator = null;
1840            if (urls) {
1841                urlGenerator = new StandardXYURLGenerator();
1842            }
1843    
1844            XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer(true, 
1845                    false);
1846            renderer.setBaseToolTipGenerator(toolTipGenerator);
1847            renderer.setURLGenerator(urlGenerator);
1848            plot.setRenderer(renderer);
1849            
1850            JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT,
1851                    plot, legend);
1852            return chart;
1853    
1854        }
1855    
1856        /**
1857         * Creates and returns a default instance of a candlesticks chart.
1858         *
1859         * @param title  the chart title (<code>null</code> permitted).
1860         * @param timeAxisLabel  a label for the time axis (<code>null</code> 
1861         *                       permitted).
1862         * @param valueAxisLabel  a label for the value axis (<code>null</code> 
1863         *                        permitted).
1864         * @param dataset  the dataset for the chart (<code>null</code> permitted).
1865         * @param legend  a flag specifying whether or not a legend is required.
1866         *
1867         * @return A candlestick chart.
1868         */
1869        public static JFreeChart createCandlestickChart(String title,
1870                                                        String timeAxisLabel,
1871                                                        String valueAxisLabel,
1872                                                        OHLCDataset dataset,
1873                                                        boolean legend) {
1874    
1875            ValueAxis timeAxis = new DateAxis(timeAxisLabel);
1876            NumberAxis valueAxis = new NumberAxis(valueAxisLabel);
1877            XYPlot plot = new XYPlot(dataset, timeAxis, valueAxis, null);
1878            plot.setRenderer(new CandlestickRenderer());
1879            JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT,
1880                    plot, legend);
1881            return chart;
1882    
1883        }
1884    
1885        /**
1886         * Creates and returns a default instance of a high-low-open-close chart.
1887         *
1888         * @param title  the chart title (<code>null</code> permitted).
1889         * @param timeAxisLabel  a label for the time axis (<code>null</code> 
1890         *                       permitted).
1891         * @param valueAxisLabel  a label for the value axis (<code>null</code> 
1892         *                        permitted).
1893         * @param dataset  the dataset for the chart (<code>null</code> permitted).
1894         * @param legend  a flag specifying whether or not a legend is required.
1895         *
1896         * @return A high-low-open-close chart.
1897         */
1898        public static JFreeChart createHighLowChart(String title,
1899                                                    String timeAxisLabel,
1900                                                    String valueAxisLabel,
1901                                                    OHLCDataset dataset,
1902                                                    boolean legend) {
1903    
1904            ValueAxis timeAxis = new DateAxis(timeAxisLabel);
1905            NumberAxis valueAxis = new NumberAxis(valueAxisLabel);
1906            HighLowRenderer renderer = new HighLowRenderer();
1907            renderer.setBaseToolTipGenerator(new HighLowItemLabelGenerator());
1908            XYPlot plot = new XYPlot(dataset, timeAxis, valueAxis, renderer);
1909            JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT,
1910                    plot, legend);
1911            return chart;
1912    
1913        }
1914    
1915        /**
1916         * Creates and returns a default instance of a high-low-open-close chart 
1917         * with a special timeline. This timeline can be a 
1918         * {@link org.jfree.chart.axis.SegmentedTimeline} such as the Monday 
1919         * through Friday timeline that will remove Saturdays and Sundays from
1920         * the axis.
1921         *
1922         * @param title  the chart title (<code>null</code> permitted).
1923         * @param timeAxisLabel  a label for the time axis (<code>null</code> 
1924         *                       permitted).
1925         * @param valueAxisLabel  a label for the value axis (<code>null</code> 
1926         *                        permitted).
1927         * @param dataset  the dataset for the chart (<code>null</code> permitted).
1928         * @param timeline  the timeline.
1929         * @param legend  a flag specifying whether or not a legend is required.
1930         *
1931         * @return A high-low-open-close chart.
1932         */
1933        public static JFreeChart createHighLowChart(String title,
1934                                                    String timeAxisLabel,
1935                                                    String valueAxisLabel,
1936                                                    OHLCDataset dataset,
1937                                                    Timeline timeline,
1938                                                    boolean legend) {
1939    
1940            DateAxis timeAxis = new DateAxis(timeAxisLabel);
1941            timeAxis.setTimeline(timeline);
1942            NumberAxis valueAxis = new NumberAxis(valueAxisLabel);
1943            HighLowRenderer renderer = new HighLowRenderer();
1944            renderer.setBaseToolTipGenerator(new HighLowItemLabelGenerator());
1945            XYPlot plot = new XYPlot(dataset, timeAxis, valueAxis, renderer);
1946            JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT,
1947                    plot, legend);
1948            return chart;
1949    
1950        }
1951    
1952        /**
1953         * Creates a bubble chart with default settings.  The chart is composed of
1954         * an {@link XYPlot}, with a {@link NumberAxis} for the domain axis,
1955         * a {@link NumberAxis} for the range axis, and an {@link XYBubbleRenderer}
1956         * to draw the data items.
1957         *
1958         * @param title  the chart title (<code>null</code> permitted).
1959         * @param xAxisLabel  a label for the X-axis (<code>null</code> permitted).
1960         * @param yAxisLabel  a label for the Y-axis (<code>null</code> permitted).
1961         * @param dataset  the dataset for the chart (<code>null</code> permitted).
1962         * @param orientation  the orientation (horizontal or vertical) 
1963         *                     (<code>null</code> NOT permitted).
1964         * @param legend  a flag specifying whether or not a legend is required.
1965         * @param tooltips  configure chart to generate tool tips?
1966         * @param urls  configure chart to generate URLs?
1967         *
1968         * @return A bubble chart.
1969         */
1970        public static JFreeChart createBubbleChart(String title,
1971                                                   String xAxisLabel,
1972                                                   String yAxisLabel,
1973                                                   XYZDataset dataset,
1974                                                   PlotOrientation orientation,
1975                                                   boolean legend,
1976                                                   boolean tooltips,
1977                                                   boolean urls) {
1978    
1979            if (orientation == null) {
1980                throw new IllegalArgumentException("Null 'orientation' argument.");
1981            }
1982            NumberAxis xAxis = new NumberAxis(xAxisLabel);
1983            xAxis.setAutoRangeIncludesZero(false);
1984            NumberAxis yAxis = new NumberAxis(yAxisLabel);
1985            yAxis.setAutoRangeIncludesZero(false);
1986    
1987            XYPlot plot = new XYPlot(dataset, xAxis, yAxis, null);
1988    
1989            XYItemRenderer renderer = new XYBubbleRenderer(
1990                    XYBubbleRenderer.SCALE_ON_RANGE_AXIS);
1991            if (tooltips) {
1992                renderer.setBaseToolTipGenerator(new StandardXYZToolTipGenerator());
1993            }
1994            if (urls) {
1995                renderer.setURLGenerator(new StandardXYZURLGenerator());
1996            }
1997            plot.setRenderer(renderer);
1998            plot.setOrientation(orientation);
1999    
2000            JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT,
2001                    plot, legend);
2002    
2003            return chart;
2004    
2005        }
2006    
2007        /**
2008         * Creates a histogram chart.  This chart is constructed with an 
2009         * {@link XYPlot} using an {@link XYBarRenderer}.  The domain and range 
2010         * axes are {@link NumberAxis} instances.
2011         *
2012         * @param title  the chart title (<code>null</code> permitted).
2013         * @param xAxisLabel  the x axis label (<code>null</code> permitted).
2014         * @param yAxisLabel  the y axis label (<code>null</code> permitted).
2015         * @param dataset  the dataset (<code>null</code> permitted).
2016         * @param orientation  the orientation (horizontal or vertical) 
2017         *                     (<code>null</code> NOT permitted).
2018         * @param legend  create a legend?
2019         * @param tooltips  display tooltips?
2020         * @param urls  generate URLs?
2021         *
2022         * @return The chart.
2023         */
2024        public static JFreeChart createHistogram(String title,
2025                                                 String xAxisLabel,
2026                                                 String yAxisLabel,
2027                                                 IntervalXYDataset dataset,
2028                                                 PlotOrientation orientation,
2029                                                 boolean legend,
2030                                                 boolean tooltips,
2031                                                 boolean urls) {
2032    
2033            if (orientation == null) {
2034                throw new IllegalArgumentException("Null 'orientation' argument.");
2035            }
2036            NumberAxis xAxis = new NumberAxis(xAxisLabel);
2037            xAxis.setAutoRangeIncludesZero(false);
2038            ValueAxis yAxis = new NumberAxis(yAxisLabel);
2039    
2040            XYItemRenderer renderer = new XYBarRenderer();
2041            if (tooltips) {
2042                renderer.setBaseToolTipGenerator(new StandardXYToolTipGenerator());
2043            }
2044            if (urls) {
2045                renderer.setURLGenerator(new StandardXYURLGenerator());
2046            }
2047    
2048            XYPlot plot = new XYPlot(dataset, xAxis, yAxis, renderer);
2049            plot.setOrientation(orientation);
2050            JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT,
2051                    plot, legend);
2052            return chart;
2053    
2054        }
2055    
2056        /**
2057         * Creates and returns a default instance of a box and whisker chart
2058         * based on data from a {@link BoxAndWhiskerCategoryDataset}.
2059         *
2060         * @param title  the chart title (<code>null</code> permitted).
2061         * @param categoryAxisLabel  a label for the category axis 
2062         *     (<code>null</code> permitted).
2063         * @param valueAxisLabel  a label for the value axis (<code>null</code> 
2064         *     permitted).
2065         * @param dataset  the dataset for the chart (<code>null</code> permitted).
2066         * @param legend  a flag specifying whether or not a legend is required.
2067         *
2068         * @return A box and whisker chart.
2069         * 
2070         * @since 1.0.4
2071         */
2072        public static JFreeChart createBoxAndWhiskerChart(String title,
2073                String categoryAxisLabel, String valueAxisLabel,
2074                BoxAndWhiskerCategoryDataset dataset, boolean legend) {
2075            
2076            CategoryAxis categoryAxis = new CategoryAxis(categoryAxisLabel);
2077            NumberAxis valueAxis = new NumberAxis(valueAxisLabel);
2078            valueAxis.setAutoRangeIncludesZero(false);
2079            
2080            BoxAndWhiskerRenderer renderer = new BoxAndWhiskerRenderer();
2081            renderer.setBaseToolTipGenerator(new BoxAndWhiskerToolTipGenerator());
2082               
2083            CategoryPlot plot = new CategoryPlot(dataset, categoryAxis, valueAxis, 
2084                    renderer);
2085            return new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT, plot, 
2086                    legend);
2087        } 
2088    
2089        /**
2090         * Creates and returns a default instance of a box and whisker chart.
2091         *
2092         * @param title  the chart title (<code>null</code> permitted).
2093         * @param timeAxisLabel  a label for the time axis (<code>null</code> 
2094         *                       permitted).
2095         * @param valueAxisLabel  a label for the value axis (<code>null</code> 
2096         *                        permitted).
2097         * @param dataset  the dataset for the chart (<code>null</code> permitted).
2098         * @param legend  a flag specifying whether or not a legend is required.
2099         *
2100         * @return A box and whisker chart.
2101         */
2102        public static JFreeChart createBoxAndWhiskerChart(String title,
2103                                                     String timeAxisLabel,
2104                                                     String valueAxisLabel,
2105                                                     BoxAndWhiskerXYDataset dataset,
2106                                                     boolean legend) {
2107    
2108            ValueAxis timeAxis = new DateAxis(timeAxisLabel);
2109            NumberAxis valueAxis = new NumberAxis(valueAxisLabel);
2110            valueAxis.setAutoRangeIncludesZero(false);
2111            XYBoxAndWhiskerRenderer renderer = new XYBoxAndWhiskerRenderer(10.0);
2112            XYPlot plot = new XYPlot(dataset, timeAxis, valueAxis, renderer);
2113            return new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT, plot, 
2114                    legend);
2115    
2116        }
2117    
2118        /**
2119         * Creates a wind plot with default settings.
2120         *
2121         * @param title  the chart title (<code>null</code> permitted).
2122         * @param xAxisLabel  a label for the x-axis (<code>null</code> permitted).
2123         * @param yAxisLabel  a label for the y-axis (<code>null</code> permitted).
2124         * @param dataset  the dataset for the chart (<code>null</code> permitted).
2125         * @param legend  a flag that controls whether or not a legend is created.
2126         * @param tooltips  configure chart to generate tool tips?
2127         * @param urls  configure chart to generate URLs?
2128         *
2129         * @return A wind plot.
2130         *
2131         */
2132        public static JFreeChart createWindPlot(String title,
2133                                                String xAxisLabel,
2134                                                String yAxisLabel,
2135                                                WindDataset dataset,
2136                                                boolean legend,
2137                                                boolean tooltips,
2138                                                boolean urls) {
2139    
2140            ValueAxis xAxis = new DateAxis(xAxisLabel);
2141            ValueAxis yAxis = new NumberAxis(yAxisLabel);
2142            yAxis.setRange(-12.0, 12.0);
2143    
2144            WindItemRenderer renderer = new WindItemRenderer();
2145            if (tooltips) {
2146                renderer.setBaseToolTipGenerator(new StandardXYToolTipGenerator());
2147            }
2148            if (urls) {
2149                renderer.setURLGenerator(new StandardXYURLGenerator());
2150            }
2151            XYPlot plot = new XYPlot(dataset, xAxis, yAxis, renderer);
2152            JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT,
2153                    plot, legend);
2154    
2155            return chart;
2156    
2157        }
2158    
2159        /**
2160         * Creates a wafer map chart.
2161         *
2162         * @param title  the chart title (<code>null</code> permitted).
2163         * @param dataset  the dataset (<code>null</code> permitted).
2164         * @param orientation  the plot orientation (horizontal or vertical) 
2165         *                     (<code>null</code> NOT permitted.
2166         * @param legend  display a legend?
2167         * @param tooltips  generate tooltips?
2168         * @param urls  generate URLs?
2169         *
2170         * @return A wafer map chart.
2171         */
2172        public static JFreeChart createWaferMapChart(String title,
2173                                                     WaferMapDataset dataset,
2174                                                     PlotOrientation orientation,
2175                                                     boolean legend,
2176                                                     boolean tooltips,
2177                                                     boolean urls) {
2178    
2179            if (orientation == null) {
2180                throw new IllegalArgumentException("Null 'orientation' argument.");
2181            }
2182            WaferMapPlot plot = new WaferMapPlot(dataset);
2183            WaferMapRenderer renderer = new WaferMapRenderer();
2184            plot.setRenderer(renderer);
2185    
2186            JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT,
2187                    plot, legend);
2188    
2189            return chart;
2190        }
2191    
2192    }