From 549b47d2ff9a543c6df7d4fa30acdbfd84a82731 Mon Sep 17 00:00:00 2001
From: timmolter <tim.molter@gmail.com>
Date: Tue, 14 Aug 2012 15:20:07 +0200
Subject: [PATCH] made API prefer to accept a Collection of Number objects for
 the axis data

---
 Sample_Chart.png                              | Bin 0 -> 10718 bytes
 src/main/java/com/xeiam/xchart/AxisPair.java  |  54 ++++--------
 src/main/java/com/xeiam/xchart/Chart.java     |  24 +++++-
 .../java/com/xeiam/xchart/PlotContent.java    |  26 +++---
 .../java/com/xeiam/xchart/series/Series.java  |  49 +++++++----
 .../xchart/example/ChartServletExample.java   |  78 ++++++++++++++++++
 .../com/xeiam/xchart/example/Example1.java    |  46 +++++++++++
 .../com/xeiam/xchart/example/Example2.java    |  62 ++++++++++++++
 .../com/xeiam/xchart/example/Example3.java    |  57 +++++++++++++
 .../com/xeiam/xchart/example/Example4.java    |  60 ++++++++++++++
 .../com/xeiam/xchart/example/Example5.java    |  44 ++++++++++
 .../com/xeiam/xchart/example/Example6.java    |  43 ++++++++++
 .../com/xeiam/xchart/example/Example7.java    |  43 ++++++++++
 .../xchart/unit/TestNumberCollection.java     |  46 +++++++++++
 14 files changed, 566 insertions(+), 66 deletions(-)
 create mode 100644 Sample_Chart.png
 create mode 100644 src/test/java/com/xeiam/xchart/example/ChartServletExample.java
 create mode 100644 src/test/java/com/xeiam/xchart/example/Example1.java
 create mode 100644 src/test/java/com/xeiam/xchart/example/Example2.java
 create mode 100644 src/test/java/com/xeiam/xchart/example/Example3.java
 create mode 100644 src/test/java/com/xeiam/xchart/example/Example4.java
 create mode 100644 src/test/java/com/xeiam/xchart/example/Example5.java
 create mode 100644 src/test/java/com/xeiam/xchart/example/Example6.java
 create mode 100644 src/test/java/com/xeiam/xchart/example/Example7.java
 create mode 100644 src/test/java/com/xeiam/xchart/unit/TestNumberCollection.java

diff --git a/Sample_Chart.png b/Sample_Chart.png
new file mode 100644
index 0000000000000000000000000000000000000000..03e05bd1563293430821ae7728851814299036eb
GIT binary patch
literal 10718
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
XrqST^<x;S>3DZ*7RV%x4>;C@$O-Izg

literal 0
HcmV?d00001

diff --git a/src/main/java/com/xeiam/xchart/AxisPair.java b/src/main/java/com/xeiam/xchart/AxisPair.java
index edd8a8fa..2c599cbd 100644
--- a/src/main/java/com/xeiam/xchart/AxisPair.java
+++ b/src/main/java/com/xeiam/xchart/AxisPair.java
@@ -17,13 +17,14 @@ package com.xeiam.xchart;
 
 import java.awt.Graphics2D;
 import java.awt.Rectangle;
+import java.util.ArrayList;
+import java.util.Collection;
 import java.util.LinkedHashMap;
 import java.util.Map;
 
 import com.xeiam.xchart.interfaces.IChartPart;
 import com.xeiam.xchart.series.Series;
 
-
 /**
  * @author timmolter
  */
@@ -57,45 +58,42 @@ public class AxisPair implements IChartPart {
    * @param xData
    * @param yData
    */
-  public Series addSeries(String seriesName, double[] xData, double[] yData) {
+  public Series addSeries(String seriesName, Collection<Number> xData, Collection<Number> yData) {
 
     // Sanity checks
     if (seriesName == null) {
-      throw new RuntimeException("Series Name cannot be null!!!");
+      throw new IllegalArgumentException("Series Name cannot be null!!!");
     }
     if (yData == null) {
-      throw new RuntimeException("Y-Axis data cannot be null!!!");
+      throw new IllegalArgumentException("Y-Axis data cannot be null!!!");
     }
-    if (yData.length == 0) {
-      throw new RuntimeException("Y-Axis data cannot be empty!!!");
+    if (yData.size() == 0) {
+      throw new IllegalArgumentException("Y-Axis data cannot be empty!!!");
     }
-    if (xData != null && xData.length == 0) {
-      throw new RuntimeException("X-Axis data cannot be empty!!!");
+    if (xData != null && xData.size() == 0) {
+      throw new IllegalArgumentException("X-Axis data cannot be empty!!!");
     }
-    if (xData != null && xData.length == 1 && Double.isNaN(yData[0])) {
-      throw new RuntimeException("X-Axis data cannot contain a single NaN value!!!");
+    if (xData != null && xData.size() == 1 && Double.isNaN(xData.iterator().next().doubleValue())) {
+      throw new IllegalArgumentException("X-Axis data cannot contain a single NaN value!!!");
     }
-    if (yData.length == 1 && Double.isNaN(yData[0])) {
-      throw new RuntimeException("Y-Axis data cannot contain a single NaN value!!!");
+    if (yData.size() == 1 && Double.isNaN(yData.iterator().next().doubleValue())) {
+      throw new IllegalArgumentException("Y-Axis data cannot contain a single NaN value!!!");
     }
 
     Series series;
     if (xData != null) {
-      verifyValues(xData);
-      verifyValues(yData);
       series = new Series(seriesName, xData, yData);
     } else { // generate xData
-      double[] generatedXData = new double[yData.length];
-      verifyValues(yData);
-      for (int i = 1; i < yData.length; i++) {
-        generatedXData[i] = i;
+      Collection<Number> generatedXData = new ArrayList<Number>();
+      for (int i = 1; i < yData.size(); i++) {
+        generatedXData.add(i);
       }
       series = new Series(seriesName, generatedXData, yData);
     }
 
     // Sanity check
-    if (xData != null && xData.length != yData.length) {
-      throw new RuntimeException("X and Y-Axis lengths are not the same!!! ");
+    if (xData != null && xData.size() != yData.size()) {
+      throw new IllegalArgumentException("X and Y-Axis lengths are not the same!!! ");
     }
 
     seriesMap.put(seriesCount++, series);
@@ -107,22 +105,6 @@ public class AxisPair implements IChartPart {
     return series;
   }
 
-  /**
-   * Checks for invalid values in data array
-   * 
-   * @param data
-   */
-  private void verifyValues(double[] data) {
-
-    for (int i = 0; i < data.length; i++) {
-      if (data[i] == Double.POSITIVE_INFINITY) {
-        throw new RuntimeException("Axis data cannot contain Double.POSITIVE_INFINITY!!!");
-      } else if (data[i] == Double.NEGATIVE_INFINITY) {
-        throw new RuntimeException("Axis data cannot contain Double.NEGATIVE_INFINITY!!!");
-      }
-    }
-  }
-
   protected Axis getXAxis() {
 
     return xAxis;
diff --git a/src/main/java/com/xeiam/xchart/Chart.java b/src/main/java/com/xeiam/xchart/Chart.java
index 3b6ee801..0350c7f8 100644
--- a/src/main/java/com/xeiam/xchart/Chart.java
+++ b/src/main/java/com/xeiam/xchart/Chart.java
@@ -17,6 +17,8 @@ package com.xeiam.xchart;
 
 import java.awt.Graphics2D;
 import java.awt.RenderingHints;
+import java.util.ArrayList;
+import java.util.Collection;
 
 import com.xeiam.xchart.series.Series;
 import com.xeiam.xchart.series.SeriesColor;
@@ -107,13 +109,31 @@ public class Chart {
     return plot;
   }
 
-  // EXTERNAL GETTERS & SETTERS
+  // PUBLIC SETTERS
 
-  public Series addSeries(String seriesName, double[] xData, double[] yData) {
+  public Series addSeries(String seriesName, Collection<Number> xData, Collection<Number> yData) {
 
     return axisPair.addSeries(seriesName, xData, yData);
   }
 
+  @Deprecated
+  public Series addSeries(String seriesName, double[] xData, double[] yData) {
+
+    Collection<Number> xDataNumber = null;
+    if (xData != null) {
+      xDataNumber = new ArrayList<Number>();
+      for (double d : xData) {
+        xDataNumber.add(new Double(d));
+      }
+    }
+    Collection<Number> yDataNumber = new ArrayList<Number>();
+    for (double d : yData) {
+      yDataNumber.add(new Double(d));
+    }
+
+    return axisPair.addSeries(seriesName, xDataNumber, yDataNumber);
+  }
+
   public void setChartTitle(String title) {
 
     this.chartTitle.setText(title);
diff --git a/src/main/java/com/xeiam/xchart/PlotContent.java b/src/main/java/com/xeiam/xchart/PlotContent.java
index 7c4f8870..8e83f5c8 100644
--- a/src/main/java/com/xeiam/xchart/PlotContent.java
+++ b/src/main/java/com/xeiam/xchart/PlotContent.java
@@ -17,12 +17,13 @@ package com.xeiam.xchart;
 
 import java.awt.Graphics2D;
 import java.awt.Rectangle;
+import java.util.Collection;
+import java.util.Iterator;
 import java.util.Map;
 
 import com.xeiam.xchart.interfaces.IChartPart;
 import com.xeiam.xchart.series.Series;
 
-
 /**
  * @author timmolter
  */
@@ -63,30 +64,27 @@ public class PlotContent implements IChartPart {
       int yTopMargin = AxisPair.getMargin((int) bounds.getHeight(), yTickSpace);
 
       // data points
-      double[] xData = series.getxData();
+      Collection<Number> xData = series.getxData();
       double xMin = chart.getAxisPair().getXAxis().getMin();
       double xMax = chart.getAxisPair().getXAxis().getMax();
-      double[] yData = series.getyData();
+      Collection<Number> yData = series.getyData();
       double yMin = chart.getAxisPair().getYAxis().getMin();
       double yMax = chart.getAxisPair().getYAxis().getMax();
 
       int previousX = Integer.MIN_VALUE;
       int previousY = Integer.MIN_VALUE;
 
-      for (int i = 0; i < xData.length; i++) {
-
-        if (Double.isInfinite(xData[i])) {
-          throw new RuntimeException("Infinite values in xAxis Data not allowed!!!");
-        }
+      Iterator<Number> xItr = xData.iterator();
+      Iterator<Number> yItr = yData.iterator();
+      while (xItr.hasNext()) {
 
-        if (Double.isInfinite(yData[i])) {
-          throw new RuntimeException("Infinite values in yAxis Data not allowed!!!");
-        }
+        double x = xItr.next().doubleValue();
+        double y = yItr.next().doubleValue();
 
-        if (!Double.isNaN(xData[i]) && !Double.isNaN(yData[i])) {
+        if (!Double.isNaN(x) && !Double.isNaN(y)) {
 
-          int xTransform = (int) (xLeftMargin + ((xData[i] - xMin) / (xMax - xMin) * xTickSpace));
-          int yTransform = (int) (bounds.getHeight() - (yTopMargin + (yData[i] - yMin) / (yMax - yMin) * yTickSpace));
+          int xTransform = (int) (xLeftMargin + ((x - xMin) / (xMax - xMin) * xTickSpace));
+          int yTransform = (int) (bounds.getHeight() - (yTopMargin + (y - yMin) / (yMax - yMin) * yTickSpace));
 
           // a check if all y data are the exact same values
           if (Math.abs(xMax - xMin) / 5 == 0.0) {
diff --git a/src/main/java/com/xeiam/xchart/series/Series.java b/src/main/java/com/xeiam/xchart/series/Series.java
index 70f12296..585f1561 100644
--- a/src/main/java/com/xeiam/xchart/series/Series.java
+++ b/src/main/java/com/xeiam/xchart/series/Series.java
@@ -17,10 +17,10 @@ package com.xeiam.xchart.series;
 
 import java.awt.BasicStroke;
 import java.awt.Color;
+import java.util.Collection;
 
 import com.xeiam.xchart.series.markers.Marker;
 
-
 /**
  * @author timmolter
  */
@@ -28,9 +28,9 @@ public class Series {
 
   private String name = "";
 
-  protected double[] xData;
+  protected Collection<Number> xData;
 
-  protected double[] yData;
+  protected Collection<Number> yData;
 
   /** the minimum value of axis range */
   private double xMin;
@@ -63,7 +63,7 @@ public class Series {
    * @param xData
    * @param yData
    */
-  public Series(String name, double[] xData, double[] yData) {
+  public Series(String name, Collection<Number> xData, Collection<Number> yData) {
 
     this.name = name;
     this.xData = xData;
@@ -90,36 +90,57 @@ public class Series {
 
   }
 
-  private double[] findMinMax(double[] data) {
+  /**
+   * Finds the min and max of a dataset
+   * 
+   * @param data
+   * @return
+   */
+  private double[] findMinMax(Collection<Number> data) {
 
     Double min = null;
     Double max = null;
-    for (int i = 0; i < data.length; i++) {
-      if (min == null || data[i] < min) {
-        if (!Double.isNaN(data[i])) {
-          min = data[i];
+    for (Number number : data) {
+      verify(number.doubleValue());
+      if (min == null || number.doubleValue() < min) {
+        if (!Double.isNaN(number.doubleValue())) {
+          min = number.doubleValue();
         }
       }
-      if (max == null || data[i] > max) {
-        if (!Double.isNaN(data[i])) {
-          max = data[i];
+      if (max == null || number.doubleValue() > max) {
+        if (!Double.isNaN(number.doubleValue())) {
+          max = number.doubleValue();
         }
       }
     }
     return new double[] { min, max };
   }
 
+  /**
+   * Checks for invalid values in data array
+   * 
+   * @param data
+   */
+  private void verify(double value) {
+
+    if (value == Double.POSITIVE_INFINITY) {
+      throw new RuntimeException("Axis data cannot contain Double.POSITIVE_INFINITY!!!");
+    } else if (value == Double.NEGATIVE_INFINITY) {
+      throw new RuntimeException("Axis data cannot contain Double.NEGATIVE_INFINITY!!!");
+    }
+  }
+
   public String getName() {
 
     return name;
   }
 
-  public double[] getxData() {
+  public Collection<Number> getxData() {
 
     return xData;
   }
 
-  public double[] getyData() {
+  public Collection<Number> getyData() {
 
     return yData;
   }
diff --git a/src/test/java/com/xeiam/xchart/example/ChartServletExample.java b/src/test/java/com/xeiam/xchart/example/ChartServletExample.java
new file mode 100644
index 00000000..2efb359e
--- /dev/null
+++ b/src/test/java/com/xeiam/xchart/example/ChartServletExample.java
@@ -0,0 +1,78 @@
+/**
+ * Copyright 2011-2012 Xeiam LLC.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.xeiam.xchart.example;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+import javax.servlet.ServletException;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.xeiam.xchart.BitmapEncoder;
+import com.xeiam.xchart.Chart;
+import com.xeiam.xchart.QuickChart;
+
+/**
+ * Generates, stores, and serves charts
+ * 
+ * @author timmolter
+ */
+@javax.servlet.annotation.WebServlet(name = "ChartServlet", urlPatterns = { "/chart" }, asyncSupported = true)
+public class ChartServletExample extends HttpServlet {
+
+  private static Map<String, Chart> chartMap = new HashMap<String, Chart>();
+
+  @Override
+  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException {
+
+    String id = request.getParameter("id");
+
+    Chart chart = chartMap.get(id);
+
+    response.setContentType("image/png");
+    ServletOutputStream out = response.getOutputStream();
+
+    try {
+      BitmapEncoder.streamPNG(out, chart);
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+
+    out.close();
+
+    chart = null;
+
+    chartMap.remove(id);
+  }
+
+  /**
+   * Generates a chart and puts it in chartMap
+   * 
+   * @return UUID uniquely identifying chart in the chartMap
+   */
+  public static String generateDummyChart() {
+
+    Chart chart = QuickChart.getChart("Sample Chart", "X", "Y", null, null, new double[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 });
+    String uuid = UUID.randomUUID().toString();
+    chartMap.put(uuid, chart);
+
+    return uuid;
+  }
+}
diff --git a/src/test/java/com/xeiam/xchart/example/Example1.java b/src/test/java/com/xeiam/xchart/example/Example1.java
new file mode 100644
index 00000000..7eff2381
--- /dev/null
+++ b/src/test/java/com/xeiam/xchart/example/Example1.java
@@ -0,0 +1,46 @@
+/**
+ * Copyright 2011-2012 Xeiam LLC.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.xeiam.xchart.example;
+
+import com.xeiam.xchart.BitmapEncoder;
+import com.xeiam.xchart.Chart;
+
+/**
+ * Creates a simple charts and saves it as aPNG image file.
+ * 
+ * @author timmolter
+ */
+public class Example1 {
+
+  public static void main(String[] args) {
+
+    double[] xData = { 0.0, 1.0, 2.0 };
+    double[] yData = { 0.0, 1.0, 2.0 };
+
+    // Create Chart
+    Chart chart = new Chart(500, 400);
+    chart.setChartTitle("Sample Chart");
+    chart.setXAxisTitle("X");
+    chart.setYAxisTitle("Y");
+    chart.addSeries("y(x)", xData, yData);
+
+    try {
+      BitmapEncoder.savePNG(chart, "./Sample_Chart.png");
+    } catch (Exception e) {
+      e.printStackTrace();
+    }
+  }
+}
diff --git a/src/test/java/com/xeiam/xchart/example/Example2.java b/src/test/java/com/xeiam/xchart/example/Example2.java
new file mode 100644
index 00000000..02a1f115
--- /dev/null
+++ b/src/test/java/com/xeiam/xchart/example/Example2.java
@@ -0,0 +1,62 @@
+/**
+ * Copyright 2011-2012 Xeiam LLC.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.xeiam.xchart.example;
+
+import com.xeiam.xchart.Chart;
+import com.xeiam.xchart.series.Series;
+import com.xeiam.xchart.series.SeriesColor;
+import com.xeiam.xchart.series.SeriesLineStyle;
+import com.xeiam.xchart.series.SeriesMarker;
+import com.xeiam.xchart.swing.SwingWrapper;
+
+/**
+ * Embed a Chart in a simple Swing application
+ * 
+ * @author timmolter
+ */
+public class Example2 {
+
+  public static void main(String[] args) {
+
+    // generates sine data
+    int size = 30;
+    double[] xData1 = new double[size + 1];
+    double[] yData1 = new double[size + 1];
+    for (int i = 0; i <= size; i++) {
+      double radians = (Math.PI / (size / 2) * i);
+      xData1[i] = i - size / 2;
+      yData1[i] = size * Math.sin(radians);
+    }
+
+    // Create Chart
+    Chart chart = new Chart(440, 300);
+
+    // Customize Chart
+    chart.setChartTitleVisible(false);
+    chart.setChartLegendVisible(false);
+    chart.setAxisTitlesVisible(false);
+
+    // Series 1
+    Series series1 = chart.addSeries("y=sin(x)", xData1, yData1);
+    series1.setLineColor(SeriesColor.PURPLE);
+    series1.setLineStyle(SeriesLineStyle.DASH_DASH);
+    series1.setMarkerColor(SeriesColor.GREEN);
+    series1.setMarker(SeriesMarker.SQUARE);
+
+    new SwingWrapper(chart).displayChart();
+  }
+
+}
diff --git a/src/test/java/com/xeiam/xchart/example/Example3.java b/src/test/java/com/xeiam/xchart/example/Example3.java
new file mode 100644
index 00000000..bd5bf769
--- /dev/null
+++ b/src/test/java/com/xeiam/xchart/example/Example3.java
@@ -0,0 +1,57 @@
+/**
+ * Copyright 2011-2012 Xeiam LLC.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.xeiam.xchart.example;
+
+import com.xeiam.xchart.Chart;
+import com.xeiam.xchart.swing.SwingWrapper;
+
+/**
+ * Create multiple curves on one chart
+ * 
+ * @author timmolter
+ */
+public class Example3 {
+
+  public static void main(String[] args) {
+
+    // Create Chart
+    Chart chart = new Chart(700, 500);
+
+    for (int i = 1; i <= 14; i++) {
+
+      // generates linear data
+      int b = 20;
+      double[] xData = new double[b + 1];
+      double[] yData = new double[b + 1];
+      for (int x = 0; x <= b; x++) {
+        xData[x] = 2 * x - b;
+        yData[x] = 2 * i * x - i * b;
+      }
+
+      // Customize Chart
+      chart.setChartTitle("Sample Chart");
+      chart.setXAxisTitle("X");
+      chart.setYAxisTitle("Y");
+
+      String seriesName = "y=" + 2 * i + "x-" + i * b + "b";
+      chart.addSeries(seriesName, xData, yData);
+
+    }
+
+    new SwingWrapper(chart).displayChart();
+  }
+
+}
diff --git a/src/test/java/com/xeiam/xchart/example/Example4.java b/src/test/java/com/xeiam/xchart/example/Example4.java
new file mode 100644
index 00000000..56fbeee6
--- /dev/null
+++ b/src/test/java/com/xeiam/xchart/example/Example4.java
@@ -0,0 +1,60 @@
+/**
+ * Copyright 2011-2012 Xeiam LLC.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.xeiam.xchart.example;
+
+import com.xeiam.xchart.Chart;
+import com.xeiam.xchart.QuickChart;
+import com.xeiam.xchart.swing.SwingWrapper;
+
+/**
+ * Create a chart matrix
+ * 
+ * @author timmolter
+ */
+public class Example4 {
+
+  public static void main(String[] args) {
+
+    int numRows = 2;
+    int numCols = 2;
+    Chart[] charts = new Chart[numRows * numCols];
+
+    int chartCount = 0;
+    for (int i = 0; i < numRows; i++) {
+      for (int j = 0; j < numCols; j++) {
+
+        charts[chartCount++] = QuickChart.getChart(i + "," + j, "X", "Y", null, null, getRandomWalk(1000));
+      }
+    }
+    new SwingWrapper(charts, numRows, numCols).displayChartMatrix();
+  }
+
+  /**
+   * Generates a set of random walk data
+   * 
+   * @param numPoints
+   * @return
+   */
+  private static double[] getRandomWalk(int numPoints) {
+
+    double[] y = new double[numPoints];
+    y[0] = 0;
+    for (int i = 1; i < y.length; i++) {
+      y[i] = y[i - 1] + Math.random() - .5;
+    }
+    return y;
+  }
+}
diff --git a/src/test/java/com/xeiam/xchart/example/Example5.java b/src/test/java/com/xeiam/xchart/example/Example5.java
new file mode 100644
index 00000000..bb765cd9
--- /dev/null
+++ b/src/test/java/com/xeiam/xchart/example/Example5.java
@@ -0,0 +1,44 @@
+/**
+ * Copyright 2011-2012 Xeiam LLC.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.xeiam.xchart.example;
+
+import com.xeiam.xchart.Chart;
+import com.xeiam.xchart.swing.SwingWrapper;
+
+/**
+ * Plot vertical and horizontal lines
+ * 
+ * @author timmolter
+ */
+public class Example5 {
+
+  public static void main(String[] args) {
+
+    // Create Chart
+    Chart chart = new Chart(700, 500);
+
+    // Customize Chart
+    chart.setChartTitle("Sample Chart");
+    chart.setXAxisTitle("X");
+    chart.setYAxisTitle("Y");
+
+    chart.addSeries("vertical", new double[] { 1, 1 }, new double[] { -10, 10 });
+    chart.addSeries("horizontal", new double[] { -10, 10 }, new double[] { 0, 0 });
+
+    new SwingWrapper(chart).displayChart();
+  }
+
+}
diff --git a/src/test/java/com/xeiam/xchart/example/Example6.java b/src/test/java/com/xeiam/xchart/example/Example6.java
new file mode 100644
index 00000000..a283dc64
--- /dev/null
+++ b/src/test/java/com/xeiam/xchart/example/Example6.java
@@ -0,0 +1,43 @@
+/**
+ * Copyright 2011-2012 Xeiam LLC.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.xeiam.xchart.example;
+
+import com.xeiam.xchart.Chart;
+import com.xeiam.xchart.swing.SwingWrapper;
+
+/**
+ * Create chart with single point
+ * 
+ * @author timmolter
+ */
+public class Example6 {
+
+  public static void main(String[] args) {
+
+    // Create Chart
+    Chart chart = new Chart(700, 500);
+
+    // Customize Chart
+    chart.setChartTitle("Sample Chart");
+    chart.setXAxisTitle("X");
+    chart.setYAxisTitle("Y");
+
+    chart.addSeries("single point (1,1)", new double[] { 1 }, new double[] { 1 });
+
+    new SwingWrapper(chart).displayChart();
+  }
+
+}
diff --git a/src/test/java/com/xeiam/xchart/example/Example7.java b/src/test/java/com/xeiam/xchart/example/Example7.java
new file mode 100644
index 00000000..8a4949e6
--- /dev/null
+++ b/src/test/java/com/xeiam/xchart/example/Example7.java
@@ -0,0 +1,43 @@
+/**
+ * Copyright 2011-2012 Xeiam LLC.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.xeiam.xchart.example;
+
+import com.xeiam.xchart.Chart;
+import com.xeiam.xchart.swing.SwingWrapper;
+
+/**
+ * Create chart with NaN values
+ * 
+ * @author timmolter
+ */
+public class Example7 {
+
+  public static void main(String[] args) {
+
+    // Create Chart
+    Chart chart = new Chart(700, 500);
+
+    // Customize Chart
+    chart.setChartTitle("Sample Chart");
+    chart.setXAxisTitle("X");
+    chart.setYAxisTitle("Y");
+
+    chart.addSeries("NaN Value at (3,2)", null, new double[] { 0, 1, Double.NaN, 3, 4 });
+
+    new SwingWrapper(chart).displayChart();
+  }
+
+}
diff --git a/src/test/java/com/xeiam/xchart/unit/TestNumberCollection.java b/src/test/java/com/xeiam/xchart/unit/TestNumberCollection.java
new file mode 100644
index 00000000..eaf5b86c
--- /dev/null
+++ b/src/test/java/com/xeiam/xchart/unit/TestNumberCollection.java
@@ -0,0 +1,46 @@
+package com.xeiam.xchart.unit;
+
+import static org.hamcrest.CoreMatchers.equalTo;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.not;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+import org.junit.Test;
+
+/**
+ * @author timmolter
+ * @create Aug 14, 2012
+ */
+public class TestNumberCollection {
+
+  @Test
+  public void testNumber2double() {
+
+    Number myInteger = new Integer(688);
+    assertThat(myInteger.doubleValue(), is(equalTo(new Double(688).doubleValue())));
+
+    Number myLong = new Long(976320011);
+    assertThat(myLong.doubleValue(), is(equalTo(new Long(976320011).doubleValue())));
+
+    Number myFloat = new Float(95.4765217889);
+    assertThat(myFloat.doubleValue(), is(equalTo(new Float(95.4765217889).doubleValue())));
+
+    Number myDouble = new Double(33.2);
+    assertThat(myDouble.doubleValue(), is(equalTo(33.2)));
+
+  }
+
+  @Test
+  public void testDoubleInfinity() {
+
+    Number myDouble = new Double(33.2);
+    assertThat(myDouble.doubleValue(), is(not(equalTo(Double.POSITIVE_INFINITY))));
+
+    myDouble = new Double(Double.POSITIVE_INFINITY);
+    assertThat(myDouble.doubleValue(), is(equalTo(Double.POSITIVE_INFINITY)));
+
+    Number myInteger = new Integer(688);
+    assertThat(myInteger.doubleValue(), is(not(equalTo(Double.POSITIVE_INFINITY))));
+
+  }
+}
-- 
GitLab