/** * * The MIT License * * Copyright (c) 2011 the original author or authors. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ package com.googlecode.charts4j; import static com.googlecode.charts4j.collect.Preconditions.*; import java.util.List; import com.googlecode.charts4j.collect.ImmutableList; import com.googlecode.charts4j.collect.Lists; /** * Static factory class for {@link Plot} hierarchy. The plots can then be * rendered by a {@link GChart}. * * @see GChart * @see GCharts * @see Data * @see DataUtil * @author Julien Chastang (julien.c.chastang at gmail dot com) * */ public final class Plots { /** * Static factory class can never be instantiated. */ private Plots() { throw new AssertionError(); } /** * Define a bar chart plot. This data will be rendered by a {@link BarChart}. * * @param data * Data for this bar chart plot. Cannot be null. * @see Data * @see DataUtil * @return a bar chart plot */ public static BarChartPlot newBarChartPlot(final Data data) { checkNotNull(data, "data cannot be null."); return new PlotImpl(data); } /** * Define a bar chart plot. This data will be rendered by a {@link BarChart}. * * @param data * Data for this bar chart plot. Cannot be null. * @param color * Color for this bar chart plot. Cannot be null. * * @see Data * @see DataUtil * @return a bar chart plot */ public static BarChartPlot newBarChartPlot(final Data data, final Color color) { checkNotNull(data, "data cannot be null."); checkNotNull(color, "color cannot be null."); final BarChartPlot plot = new PlotImpl(data); plot.setColor(color); return plot; } /** * Define a bar chart series. This data will be rendered by {@link BarChart}. * * * @param data * Data for this bar chart plot. Cannot be null. * @param color * Color for this bar chart plot. Cannot be null. * @param legend * Legend for this bar chart plot. Cannot be null. * @see Data * @see DataUtil * @return a bar chart plot */ public static BarChartPlot newBarChartPlot(final Data data, final Color color, final String legend) { checkNotNull(data, "data cannot be null."); checkNotNull(color, "color cannot be null."); checkNotNull(legend, "legend cannot be null."); final BarChartPlot plot = new PlotImpl(data); plot.setColor(color); plot.setLegend(legend); return plot; } /** * Create the scatter plot data. * * @param xData * x data. Cannot be null. * @param yData * y data. Cannot be null. * @see Data * @return a scatter plot plot */ public static ScatterPlotData newScatterPlotData(final Data xData, final Data yData) { checkNotNull(xData, "x data cannot be null."); checkNotNull(yData, "y data cannot be null."); checkArgument(xData.getSize() == yData.getSize(), "x and y data do not have the same number of elements"); return new PlotImpl(xData, yData); } /** * Create the scatter plot data. For the 3rd argument, specify the size of * the data points. The data in this argument defines the sizes of each * point specified in the x,y data (first and second argument). For the * points to be properly rendered according to desired sizes, the developer * must also specify shape marker(s) for each point via the * {@link Plot#addShapeMarkers(Shape, Color, int)} method. * <p> * The size at which the data point is rendered is a function the marker * size defined via the {@link Plot#addShapeMarkers(Shape, Color, int)} * method, and the values passed into this method in the pointSizes object. * For instance, if a point is defined (via the shape marker) with a size of * 20, then the element that corresponds to that point in the data series * will render proportionally to that marker definition. A value of 0 will * render at size 0, a value of 100 will render at size 20. * * @param xData * x data. Cannot be null. * @param yData * y data. Cannot be null. * @param pointSizes * size of x,y data. Cannot be null. * @see Data * @return a scatter plot plot. */ public static ScatterPlotData newScatterPlotData(final Data xData, final Data yData, final Data pointSizes) { checkNotNull(xData, "x data cannot be null."); checkNotNull(yData, "y data cannot be null."); checkNotNull(pointSizes, "pointSizes data cannot be null."); checkArgument(xData.getSize() == yData.getSize() && xData.getSize() == pointSizes.getSize(), "x, y, and pointSizes data do not have the same number of elements"); final PlotImpl plotImpl = new PlotImpl(xData, yData); plotImpl.setPointSizes(pointSizes); return plotImpl; } /** * Define a line. This data will be rendered by a {@link LineChart}. * * @param data * Data for this line. Cannot be null. * @see Data * @see DataUtil * @return line plot */ public static Line newLine(final Data data) { checkNotNull(data, "data cannot be null."); return new PlotImpl(data); } /** * Define a line. This data will be rendered by a {@link LineChart}. * * @param data * Data for this line. Cannot be null. * @param color * Line color. Cannot be null. * * @see Data * @see DataUtil * @return line plot */ public static Line newLine(final Data data, final Color color) { checkNotNull(data, "data cannot be null."); checkNotNull(color, "color cannot be null."); final Line line = new PlotImpl(data); line.setColor(color); return line; } /** * Define a line. This data will be rendered by a {@link LineChart}. * * @param data * Data for this line. Cannot be null. * @param color * Line color. Cannot be null. * @param legend * Legend for this line. Cannot be null. * @see Data * @see DataUtil * @return line plot */ public static Line newLine(final Data data, final Color color, final String legend) { checkNotNull(data, "data cannot be null."); checkNotNull(color, "color cannot be null."); checkNotNull(legend, "legend cannot be null."); final Line line = new PlotImpl(data); line.setColor(color); line.setLegend(legend); return line; } /** * Define a xy line. This data will be rendered by a {@link XYLineChart}. * * @param xData * Data for this xy line. * @param yData * Data for this xy line. * @see Data * @return xy line plot. */ public static XYLine newXYLine(final Data xData, final Data yData) { checkNotNull(xData, "x data cannot be null."); checkNotNull(yData, "y data cannot be null."); checkArgument(xData.getSize() == yData.getSize(), "x and y data do not have the same number of elements"); return new PlotImpl(xData, yData); } /** * Define a xy line. This data will be rendered by a {@link XYLineChart}. * * @param xData * Data for this xy line. Cannot be null. * @param yData * Data for this xy line. Cannot be null. * @param color * XYLine color. Cannot be null. * * @see Data * @see DataUtil * @return xy line plot */ public static XYLine newXYLine(final Data xData, final Data yData, final Color color) { checkNotNull(xData, "x data cannot be null."); checkNotNull(yData, "y data cannot be null."); checkNotNull(color, "color cannot be null."); checkArgument(xData.getSize() == yData.getSize(), "x and y data do not have the same number of elements"); final XYLine xyLine = new PlotImpl(xData, yData); xyLine.setColor(color); return xyLine; } /** * Define a xy line. This data will be rendered by a {@link XYLineChart}. * * @param xData * Data for this xy line. Cannot be null. * @param yData * Data for this xy line. Cannot be null. * @param color * XYLine color. Cannot be null. * @param legend * Legend for this xy line. Cannot be null. * @see Data * @see DataUtil * @return xy line plot */ public static XYLine newXYLine(final Data xData, final Data yData, final Color color, final String legend) { checkNotNull(xData, "x data cannot be null."); checkNotNull(yData, "y data cannot be null."); checkNotNull(color, "color cannot be null."); checkNotNull(legend, "legend cannot be null."); checkArgument(xData.getSize() == yData.getSize(), "x and y data do not have the same number of elements"); final XYLine xyLine = new PlotImpl(xData, yData); xyLine.setColor(color); xyLine.setLegend(legend); return xyLine; } /** * Define a radar plot. This data will be rendered by a {@link RadarPlot}. * * @param data * Data for this radar plot. Cannot be null. * @see Data * @see DataUtil * @return radar plot */ public static RadarPlot newRadarPlot(final Data data) { checkNotNull(data, "data cannot be null."); return new PlotImpl(data); } /** * Define a radar plot. This data will be rendered by a {@link RadarPlot}. * * @param data * Data for this radar plot. Cannot be null. * @param color * RadarPlot color. Cannot be null. * * @see Data * @see DataUtil * @return Radar plot */ public static RadarPlot newRadarPlot(final Data data, final Color color) { checkNotNull(data, "data cannot be null."); checkNotNull(color, "color cannot be null."); final RadarPlot plot = new PlotImpl(data); plot.setColor(color); return plot; } /** * Define a radar plot. This data will be rendered by a {@link RadarPlot}. * * @param data * Data for this radar plot. Cannot be null. * @param color * RadarPlot color. Cannot be null. * @param legend * Legend for this radar plot. Cannot be null. * @see Data * @see DataUtil * @return Radar plot. */ public static RadarPlot newRadarPlot(final Data data, final Color color, final String legend) { checkNotNull(data, "data cannot be null."); checkNotNull(color, "color cannot be null."); checkNotNull(legend, "legend cannot be null."); final RadarPlot plot = new PlotImpl(data); plot.setColor(color); plot.setLegend(legend); return plot; } /** * Define a plot. This data will be rendered by a {@link LineChart} * {@link XYLineChart} {@link BarChart} {@link RadarPlot}. * * @param data * Data for this plot. Cannot be null. * @see Data * @see DataUtil * @return plot */ public static Plot newPlot(final Data data) { checkNotNull(data, "data cannot be null."); return new PlotImpl(data); } /** * Define a plot. This data will be rendered by a {@link LineChart} * {@link XYLineChart} {@link BarChart} {@link RadarPlot}. * * @param data * Data for this plot. Cannot be null. * @param color * Plot color. Cannot be null. * * @see Data * @see DataUtil * @return plot */ public static Plot newPlot(final Data data, final Color color) { checkNotNull(data, "data cannot be null."); checkNotNull(color, "color cannot be null."); final PlotImpl plotImpl = new PlotImpl(data); plotImpl.setColor(color); return plotImpl; } /** * Define a plot. This data will be rendered by a {@link LineChart} * {@link XYLineChart} {@link BarChart} {@link RadarPlot}. * * @param data * Data for this plot. Cannot be null. * @param color * Plot color. Cannot be null. * @param legend * Legend for this plot. Cannot be null. * @see Data * @see DataUtil * @return plot */ public static Plot newPlot(final Data data, final Color color, final String legend) { checkNotNull(data, "data cannot be null."); checkNotNull(color, "color cannot be null."); checkNotNull(legend, "legend cannot be null."); final PlotImpl plotImpl = new PlotImpl(data); plotImpl.setColor(color); plotImpl.setLegend(legend); return plotImpl; } /** * Make a deep copy of a plot list. * * @param plots * The list of plots to be copied. * @return An a new immutable list of plots. */ static ImmutableList<Plot> copyOf(final List<? extends Plot> plots) { final List<Plot> plotList = Lists.newLinkedList(); for (Plot p : plots) { plotList.add(p.klone()); } return Lists.copyOf(plotList); } /** * Make a deep copy of a plot list. * * @param plots * The list of plots to be copied. * @return An a new immutable list of plots. */ static ImmutableList<Plot> copyOf(final Plot... plots) { return copyOf(Lists.of(plots)); } }