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