diff --git a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/bar/BarChart05.java b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/bar/BarChart05.java
index 15416f087bb53d0b26a62cf2788c9afa4cd976bc..689c341a4420bec3a3cd2cd83dc10b771a1b4d5d 100644
--- a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/bar/BarChart05.java
+++ b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/bar/BarChart05.java
@@ -21,6 +21,9 @@
  */
 package com.xeiam.xchart.demo.charts.bar;
 
+import java.util.ArrayList;
+import java.util.Arrays;
+
 import com.xeiam.xchart.Chart;
 import com.xeiam.xchart.ChartBuilder;
 import com.xeiam.xchart.SwingWrapper;
@@ -32,7 +35,7 @@ import com.xeiam.xchart.style.theme.GGPlot2Theme;
  * <p>
  * Demonstrates the following:
  * <ul>
- * <li>Number categories
+ * <li>String categories
  * <li>Positive and negative values
  * <li>Multiple series
  */
@@ -49,12 +52,10 @@ public class BarChart05 implements ExampleChart {
   public Chart getChart() {
 
     // Create Chart
-    Chart chart = new ChartBuilder().chartType(ChartType.Bar).width(800).height(600).title("Temperature vs. Length").xAxisTitle("Length").yAxisTitle("Temperature").theme(new GGPlot2Theme()).build();
-    chart.addSeries("fish", new double[] { 10, 20, 30, 40 }, new double[] { -40, 30, 20, 60 });
-    chart.addSeries("worms", new double[] { 10, 20, 30, 40 }, new double[] { 50, 10, -20, 40 });
-
-    // Customize Chart
-    chart.getStyleManager().setChartTitleVisible(false);
+    Chart chart = new ChartBuilder().chartType(ChartType.Bar).width(800).height(600).title("Temperature vs. Color").xAxisTitle("Color").yAxisTitle("Temperature").theme(new GGPlot2Theme()).build();
+    // List<Number> data = ;
+    chart.addCategorySeries("fish", new ArrayList<String>(Arrays.asList(new String[] { "Blue", "Red", "Green", "Yellow" })), new ArrayList<Number>(Arrays.asList(new Number[] { -40, 30, 20, 60 })));
+    chart.addCategorySeries("worms", new ArrayList<String>(Arrays.asList(new String[] { "Blue", "Red", "Green", "Yellow" })), new ArrayList<Number>(Arrays.asList(new Number[] { 50, 10, -20, 40 })));
 
     return chart;
   }
diff --git a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/date/DateChart01.java b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/date/DateChart01.java
index 6625e9aa72e11ee85fe1c8191721b62f0a7026a3..ffbd858b3276044c8fd6752c020b24a653e61288 100644
--- a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/date/DateChart01.java
+++ b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/date/DateChart01.java
@@ -24,12 +24,12 @@ import java.util.Date;
 import java.util.Random;
 
 import com.xeiam.xchart.Chart;
-import com.xeiam.xchart.Series;
+import com.xeiam.xchart.ChartBuilder;
 import com.xeiam.xchart.SwingWrapper;
 import com.xeiam.xchart.demo.charts.ExampleChart;
 
 /**
- * Millisecond scale
+ * Millisecond Scale
  * 
  * @author timmolter
  */
@@ -46,7 +46,8 @@ public class DateChart01 implements ExampleChart {
   public Chart getChart() {
 
     // Create Chart
-    Chart chart = new Chart(800, 600);
+    Chart chart = new ChartBuilder().width(800).height(600).title("Millisecond Scale").build();
+    chart.getStyleManager().setLegendVisible(false);
 
     Random random = new Random();
 
@@ -67,10 +68,7 @@ public class DateChart01 implements ExampleChart {
       yData.add(Math.random() * i);
     }
 
-    // Customize Chart
-    chart.setChartTitle("DateChart01");
-    chart.getStyleManager().setLegendVisible(false);
-    Series series = chart.addDateSeries("value", xData, yData);
+    chart.addDateSeries("blah", xData, yData);
 
     return chart;
 
diff --git a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/date/DateChart02.java b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/date/DateChart02.java
index b3627c3b681a09eb0205250433012b8f4496b441..d2312070bfa6e6e678cc249bb58409fa5b95f421 100644
--- a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/date/DateChart02.java
+++ b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/date/DateChart02.java
@@ -24,12 +24,12 @@ import java.util.Date;
 import java.util.Random;
 
 import com.xeiam.xchart.Chart;
-import com.xeiam.xchart.Series;
+import com.xeiam.xchart.ChartBuilder;
 import com.xeiam.xchart.SwingWrapper;
 import com.xeiam.xchart.demo.charts.ExampleChart;
 
 /**
- * Second scale
+ * Second Scale
  * 
  * @author timmolter
  */
@@ -46,7 +46,8 @@ public class DateChart02 implements ExampleChart {
   public Chart getChart() {
 
     // Create Chart
-    Chart chart = new Chart(800, 600);
+    Chart chart = new ChartBuilder().width(800).height(600).title("Second Scale").build();
+    chart.getStyleManager().setLegendVisible(false);
 
     // generate data
     Collection<Date> xData = new ArrayList<Date>();
@@ -66,10 +67,7 @@ public class DateChart02 implements ExampleChart {
       yData.add(Math.random() * i);
     }
 
-    // Customize Chart
-    chart.setChartTitle("DateChart02");
-    chart.getStyleManager().setLegendVisible(false);
-    Series series = chart.addDateSeries("value", xData, yData);
+    chart.addDateSeries("blah", xData, yData);
 
     return chart;
 
diff --git a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/date/DateChart03.java b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/date/DateChart03.java
index 2e2dbb333570bc22926c3aa63bf04ba8ed216069..bcc34e8196d66953f5ba01e9f03b181a9746f562 100644
--- a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/date/DateChart03.java
+++ b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/date/DateChart03.java
@@ -24,12 +24,12 @@ import java.util.Date;
 import java.util.Random;
 
 import com.xeiam.xchart.Chart;
-import com.xeiam.xchart.Series;
+import com.xeiam.xchart.ChartBuilder;
 import com.xeiam.xchart.SwingWrapper;
 import com.xeiam.xchart.demo.charts.ExampleChart;
 
 /**
- * Minute scale
+ * Minute Scale
  * 
  * @author timmolter
  */
@@ -46,7 +46,8 @@ public class DateChart03 implements ExampleChart {
   public Chart getChart() {
 
     // Create Chart
-    Chart chart = new Chart(800, 600);
+    Chart chart = new ChartBuilder().width(800).height(600).title("Minute Scale").build();
+    chart.getStyleManager().setLegendVisible(false);
 
     // generate data
     Collection<Date> xData = new ArrayList<Date>();
@@ -66,10 +67,7 @@ public class DateChart03 implements ExampleChart {
       yData.add(Math.random() * i);
     }
 
-    // Customize Chart
-    chart.setChartTitle("DateChart03");
-    chart.getStyleManager().setLegendVisible(false);
-    Series series = chart.addDateSeries("value", xData, yData);
+    chart.addDateSeries("blah", xData, yData);
 
     return chart;
 
diff --git a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/date/DateChart04.java b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/date/DateChart04.java
index 9e281745343c6373bf116c423ade314a512d5420..9cd21ee35b1f679836111e12bb9551a1ca71c079 100644
--- a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/date/DateChart04.java
+++ b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/date/DateChart04.java
@@ -24,12 +24,12 @@ import java.util.Date;
 import java.util.Random;
 
 import com.xeiam.xchart.Chart;
-import com.xeiam.xchart.Series;
+import com.xeiam.xchart.ChartBuilder;
 import com.xeiam.xchart.SwingWrapper;
 import com.xeiam.xchart.demo.charts.ExampleChart;
 
 /**
- * Hour scale
+ * Hour Scale
  * 
  * @author timmolter
  */
@@ -46,7 +46,8 @@ public class DateChart04 implements ExampleChart {
   public Chart getChart() {
 
     // Create Chart
-    Chart chart = new Chart(800, 600);
+    Chart chart = new ChartBuilder().width(800).height(600).title("Hour Scale").build();
+    chart.getStyleManager().setLegendVisible(false);
 
     // generate data
     Collection<Date> xData = new ArrayList<Date>();
@@ -66,10 +67,7 @@ public class DateChart04 implements ExampleChart {
       yData.add(Math.random() * i);
     }
 
-    // Customize Chart
-    chart.setChartTitle("DateChart04");
-    chart.getStyleManager().setLegendVisible(false);
-    Series series = chart.addDateSeries("value", xData, yData);
+    chart.addDateSeries("blah", xData, yData);
 
     return chart;
 
diff --git a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/date/DateChart05.java b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/date/DateChart05.java
index d0d4b4811493ae254c4ce13cd7635a8b24a2bf72..dcbfce3f081fb1dfb25d0041137f68afcbd0c404 100644
--- a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/date/DateChart05.java
+++ b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/date/DateChart05.java
@@ -24,12 +24,12 @@ import java.util.Date;
 import java.util.Random;
 
 import com.xeiam.xchart.Chart;
-import com.xeiam.xchart.Series;
+import com.xeiam.xchart.ChartBuilder;
 import com.xeiam.xchart.SwingWrapper;
 import com.xeiam.xchart.demo.charts.ExampleChart;
 
 /**
- * Day scale
+ * Day Scale
  * 
  * @author timmolter
  */
@@ -46,7 +46,8 @@ public class DateChart05 implements ExampleChart {
   public Chart getChart() {
 
     // Create Chart
-    Chart chart = new Chart(800, 600);
+    Chart chart = new ChartBuilder().width(800).height(600).title("Day Scale").build();
+    chart.getStyleManager().setLegendVisible(false);
 
     // generate data
     Collection<Date> xData = new ArrayList<Date>();
@@ -66,10 +67,7 @@ public class DateChart05 implements ExampleChart {
       yData.add(Math.random() * i);
     }
 
-    // Customize Chart
-    chart.setChartTitle("DateChart05");
-    chart.getStyleManager().setLegendVisible(false);
-    Series series = chart.addDateSeries("value", xData, yData);
+    chart.addDateSeries("blah", xData, yData);
 
     return chart;
 
diff --git a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/date/DateChart06.java b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/date/DateChart06.java
index 785c5904261edfeda6834ccd667000b82351d4bf..a363bd52d0ff30a12e0b32a2c42e026ebbafb67f 100644
--- a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/date/DateChart06.java
+++ b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/date/DateChart06.java
@@ -24,7 +24,7 @@ import java.util.Date;
 import java.util.Random;
 
 import com.xeiam.xchart.Chart;
-import com.xeiam.xchart.Series;
+import com.xeiam.xchart.ChartBuilder;
 import com.xeiam.xchart.SwingWrapper;
 import com.xeiam.xchart.demo.charts.ExampleChart;
 
@@ -46,7 +46,8 @@ public class DateChart06 implements ExampleChart {
   public Chart getChart() {
 
     // Create Chart
-    Chart chart = new Chart(800, 600);
+    Chart chart = new ChartBuilder().width(800).height(600).title("Month Scale").build();
+    chart.getStyleManager().setLegendVisible(false);
 
     // generate data
     Collection<Date> xData = new ArrayList<Date>();
@@ -66,10 +67,7 @@ public class DateChart06 implements ExampleChart {
       yData.add(Math.random() * i);
     }
 
-    // Customize Chart
-    chart.setChartTitle("DateChart06");
-    chart.getStyleManager().setLegendVisible(false);
-    Series series = chart.addDateSeries("value", xData, yData);
+    chart.addDateSeries("blah", xData, yData);
 
     return chart;
 
diff --git a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/date/DateChart07.java b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/date/DateChart07.java
index b9d2ad5451ef8f63cd997175f9e02e38eda3c7b5..6b96f2234036c4452c01d2fbd05a5f89ba0a117d 100644
--- a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/date/DateChart07.java
+++ b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/date/DateChart07.java
@@ -24,6 +24,7 @@ import java.util.Date;
 import java.util.Random;
 
 import com.xeiam.xchart.Chart;
+import com.xeiam.xchart.ChartBuilder;
 import com.xeiam.xchart.SwingWrapper;
 import com.xeiam.xchart.demo.charts.ExampleChart;
 
@@ -45,7 +46,8 @@ public class DateChart07 implements ExampleChart {
   public Chart getChart() {
 
     // Create Chart
-    Chart chart = new Chart(800, 600);
+    Chart chart = new ChartBuilder().width(800).height(600).title("Year Scale").build();
+    chart.getStyleManager().setLegendVisible(false);
 
     // generate data
     Collection<Date> xData = new ArrayList<Date>();
@@ -65,10 +67,7 @@ public class DateChart07 implements ExampleChart {
       yData.add(Math.random() * i);
     }
 
-    // Customize Chart
-    chart.setChartTitle("DateChart06");
-    chart.getStyleManager().setLegendVisible(false);
-    chart.addDateSeries("value", xData, yData);
+    chart.addDateSeries("blah", xData, yData);
 
     return chart;
 
diff --git a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/scatter/ScatterChart03.java b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/scatter/ScatterChart03.java
index a738bb969a640f8cbf3f3031385c603989215603..14eb6ba4798c280326033e21c855d405beb9e9a6 100644
--- a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/scatter/ScatterChart03.java
+++ b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/scatter/ScatterChart03.java
@@ -19,8 +19,15 @@ import com.xeiam.xchart.Chart;
 import com.xeiam.xchart.SwingWrapper;
 import com.xeiam.xchart.demo.charts.ExampleChart;
 
+/**
+ * 
+ */
 /**
  * Single point
+ * <p>
+ * Demonstrates the following:
+ * <ul>
+ * <li>Single point
  */
 public class ScatterChart03 implements ExampleChart {
 
@@ -38,7 +45,7 @@ public class ScatterChart03 implements ExampleChart {
     Chart chart = new Chart(800, 600);
 
     // Customize Chart
-    chart.setChartTitle("ScatterChart03");
+    chart.setChartTitle("Single Point");
     chart.setXAxisTitle("X");
     chart.setYAxisTitle("Y");
 
diff --git a/xchart/src/main/java/com/xeiam/xchart/Chart.java b/xchart/src/main/java/com/xeiam/xchart/Chart.java
index 01fcd349db13c8fd2a24fc1f7137777a21c0f524..de6062539a31dd95312d25f878a05610bbf99156 100644
--- a/xchart/src/main/java/com/xeiam/xchart/Chart.java
+++ b/xchart/src/main/java/com/xeiam/xchart/Chart.java
@@ -116,6 +116,19 @@ public class Chart {
 
   // PUBLIC SETTERS
 
+  /**
+   * Add a Category series to the chart
+   * 
+   * @param seriesName
+   * @param xData
+   * @param yData
+   * @return
+   */
+  public Series addCategorySeries(String seriesName, Collection<String> xData, Collection<Number> yData) {
+
+    return axisPair.addSeries(seriesName, xData, yData, null);
+  }
+
   /**
    * Add a Date series to the chart
    * 
diff --git a/xchart/src/main/java/com/xeiam/xchart/Series.java b/xchart/src/main/java/com/xeiam/xchart/Series.java
index 638ee8ad194158b7599644047adcb7f35c9fd727..771789ce4f461562aaca2c5cd6ccea948d66921b 100644
--- a/xchart/src/main/java/com/xeiam/xchart/Series.java
+++ b/xchart/src/main/java/com/xeiam/xchart/Series.java
@@ -130,6 +130,8 @@ public class Series {
       } else if (axisType == AxisType.Date) {
         Date date = (Date) dataPoint;
         bigDecimal = new BigDecimal(date.getTime());
+      } else if (axisType == AxisType.String) {
+        return new BigDecimal[] { null, null };
       }
       if (min == null || bigDecimal.compareTo(min) < 0) {
         min = bigDecimal;
diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/Axis.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/Axis.java
index d7e0d81baa4524c94096927e2c03371198866fd6..b5a91530a5987320a84a56982dd23515e5d22f7d 100644
--- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/Axis.java
+++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/Axis.java
@@ -33,7 +33,7 @@ public class Axis implements ChartPart {
 
   public enum AxisType {
 
-    Number, Date;
+    Number, Date, String;
   }
 
   /** parent */
diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisPair.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisPair.java
index 7d7e08f2cc1543e16794177c298071897575d704..8f78703a3e4dc4bc2819f2a5606ead4e8226141d 100644
--- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisPair.java
+++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisPair.java
@@ -90,6 +90,8 @@ public class AxisPair implements ChartPart {
         xAxis.setAxisType(AxisType.Number);
       } else if (dataPoint instanceof Date) {
         xAxis.setAxisType(AxisType.Date);
+      } else if (dataPoint instanceof String) {
+        xAxis.setAxisType(AxisType.String);
       }
       yAxis.setAxisType(AxisType.Number);
       series = new Series(seriesName, xData, xAxis.getAxisType(), yData, yAxis.getAxisType(), errorBars, seriesColorMarkerLineStyleCycler.getNextSeriesColorMarkerLineStyle());
diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/PlotContentBarChart.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/PlotContentBarChart.java
index 598fe7a022f2f43eb9f1f5cc3af6a6f0de3dfdff..f036d0ddca3e421ac6e72d433203de04b57c5aca 100644
--- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/PlotContentBarChart.java
+++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/PlotContentBarChart.java
@@ -19,7 +19,6 @@ import java.awt.Graphics2D;
 import java.awt.Rectangle;
 import java.math.BigDecimal;
 import java.util.Collection;
-import java.util.Date;
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
@@ -27,7 +26,6 @@ import java.util.TreeSet;
 
 import com.xeiam.xchart.Chart;
 import com.xeiam.xchart.Series;
-import com.xeiam.xchart.internal.chartpart.Axis.AxisType;
 
 /**
  * @author timmolter
@@ -70,7 +68,6 @@ public class PlotContentBarChart extends PlotContent {
     }
     int numBars = categories.size();
     int gridStep = (int) (xTickSpace / (double) numBars);
-    int firstPosition = (int) (gridStep / 2.0);
 
     // plot series
     int seriesCounter = 0;
@@ -91,29 +88,13 @@ public class PlotContentBarChart extends PlotContent {
       }
 
       Iterator<?> categoryItr = categories.iterator();
-      Iterator<?> xItr = xData.iterator();
       Iterator<Number> yItr = yData.iterator();
 
       int barCounter = 0;
       while (categoryItr.hasNext()) {
 
-        // BigDecimal category = null;
-        // if (getChart().getAxisPair().getxAxis().getAxisType() == AxisType.Number) {
-        // category = new BigDecimal(((Number) categoryItr.next()).doubleValue());
-        // }
-        // if (getChart().getAxisPair().getxAxis().getAxisType() == AxisType.Date) {
-        // category = new BigDecimal(((Date) categoryItr.next()).getTime());
-        // }
-
         if (xData.contains(categoryItr.next())) {
 
-          BigDecimal x = null;
-          if (getChart().getAxisPair().getxAxis().getAxisType() == AxisType.Number) {
-            x = new BigDecimal(((Number) xItr.next()).doubleValue());
-          }
-          if (getChart().getAxisPair().getxAxis().getAxisType() == AxisType.Date) {
-            x = new BigDecimal(((Date) xItr.next()).getTime());
-          }
           BigDecimal y = new BigDecimal(yItr.next().doubleValue());
           int yTransform = (int) (bounds.getHeight() - (yTopMargin + y.subtract(yMin).doubleValue() / yMax.subtract(yMin).doubleValue() * yTickSpace));
           int yOffset = (int) (bounds.getY() + yTransform);
diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/axistickcalculator/AxisTickCalculator.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/axistickcalculator/AxisTickCalculator.java
index 637a21d477aaa97a33773051ee43fe93bd284339..827c79d1a5298bfbd0675859b247bb9d033c5401 100644
--- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/axistickcalculator/AxisTickCalculator.java
+++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/axistickcalculator/AxisTickCalculator.java
@@ -70,7 +70,7 @@ public abstract class AxisTickCalculator {
     // override min/max value for bar charts' Y-Axis
     BigDecimal overrideMinValue = minValue;
     BigDecimal overrideMaxValue = maxValue;
-    if (styleManager.getChartType() == ChartType.Bar) { // this is the Y-Axis for a bar chart
+    if (styleManager.getChartType() == ChartType.Bar && axisDirection == Direction.Y) { // this is the Y-Axis for a bar chart
       if (minValue.compareTo(BigDecimal.ZERO) > 0 && maxValue.compareTo(BigDecimal.ZERO) > 0) {
         overrideMinValue = BigDecimal.ZERO;
       }
diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/axistickcalculator/BarChartAxisTickCalculator.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/axistickcalculator/BarChartAxisTickCalculator.java
index 25fdfab3b52cf33686c2373de78ad6b4d5e9f77d..4e257ae82e55601868cee138497a9329de5394c0 100644
--- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/axistickcalculator/BarChartAxisTickCalculator.java
+++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/axistickcalculator/BarChartAxisTickCalculator.java
@@ -65,20 +65,20 @@ public class BarChartAxisTickCalculator extends AxisTickCalculator {
     int margin = AxisPair.getTickStartOffset(workingSpace, tickSpace); // in plot space BigDecimal gridStep = getGridStepForDecimal(tickSpace);
 
     // get all categories
-    Set<BigDecimal> categories = new TreeSet<BigDecimal>();
+    Set<Object> categories = new TreeSet<Object>();
     Map<Integer, Series> seriesMap = chart.getAxisPair().getSeriesMap();
     for (Integer seriesId : seriesMap.keySet()) {
 
       Series series = seriesMap.get(seriesId);
       Iterator<?> xItr = series.getxData().iterator();
       while (xItr.hasNext()) {
-        BigDecimal x = null;
+        Object x = null;
         if (chart.getAxisPair().getxAxis().getAxisType() == AxisType.Number) {
           x = new BigDecimal(((Number) xItr.next()).doubleValue());
-        }
-        if (chart.getAxisPair().getxAxis().getAxisType() == AxisType.Date) {
+        } else if (chart.getAxisPair().getxAxis().getAxisType() == AxisType.Date) {
           x = new BigDecimal(((Date) xItr.next()).getTime());
-          // System.out.println(x);
+        } else if (chart.getAxisPair().getxAxis().getAxisType() == AxisType.String) {
+          x = xItr.next();
         }
         categories.add(x);
       }
@@ -99,11 +99,16 @@ public class BarChartAxisTickCalculator extends AxisTickCalculator {
       dateFormatter = new DateFormatter(chart.getStyleManager());
     }
     int counter = 0;
-    for (BigDecimal category : categories) {
+    for (Object category : categories) {
       if (chart.getAxisPair().getxAxis().getAxisType() == AxisType.Number) {
-        tickLabels.add(numberFormatter.formatNumber(category));
+        tickLabels.add(numberFormatter.formatNumber((BigDecimal) category));
       } else if (chart.getAxisPair().getxAxis().getAxisType() == AxisType.Date) {
-        tickLabels.add(dateFormatter.formatDate(category));
+        long span = Math.abs(maxValue.subtract(minValue).longValue()); // in data space
+        long gridStepHint = (long) (span / (double) tickSpace * DEFAULT_TICK_MARK_STEP_HINT_X);
+        long timeUnit = dateFormatter.getTimeUnit(gridStepHint);
+        tickLabels.add(dateFormatter.formatDate((BigDecimal) category, timeUnit));
+      } else if (chart.getAxisPair().getxAxis().getAxisType() == AxisType.String) {
+        tickLabels.add(category.toString());
       }
       int tickLabelPosition = margin + firstPosition + gridStep * counter++;
       tickLocations.add(tickLabelPosition);
diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/axistickcalculator/DateAxisTickCalculator.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/axistickcalculator/DateAxisTickCalculator.java
index ca216ce07d4c413e26c846d56232cbf22b4d0191..77c253de9baef4ebd94d843c1c7c375a50ceb10f 100644
--- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/axistickcalculator/DateAxisTickCalculator.java
+++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/axistickcalculator/DateAxisTickCalculator.java
@@ -54,40 +54,12 @@ public class DateAxisTickCalculator extends AxisTickCalculator {
 
   private void calculate() {
 
-    // a check if all axis data are the exact same values
-    if (minValue == maxValue) {
-      tickLabels.add(dateFormatter.formatDate(maxValue));
-      tickLocations.add((int) (workingSpace / 2.0));
-      return;
-    }
-
     // tick space - a percentage of the working space available for ticks, i.e. 95%
     int tickSpace = AxisPair.getTickSpace(workingSpace); // in plot space
 
     // where the tick should begin in the working space in pixels
     int margin = AxisPair.getTickStartOffset(workingSpace, tickSpace); // in plot space BigDecimal gridStep = getGridStepForDecimal(tickSpace);
 
-    BigDecimal gridStep = getGridStep(tickSpace);
-    BigDecimal firstPosition = getFirstPosition(gridStep);
-
-    // generate all tickLabels and tickLocations from the first to last position
-    for (BigDecimal tickPosition = firstPosition; tickPosition.compareTo(maxValue) <= 0; tickPosition = tickPosition.add(gridStep)) {
-
-      tickLabels.add(dateFormatter.formatDate(tickPosition));
-      // here we convert tickPosition finally to plot space, i.e. pixels
-      int tickLabelPosition = (int) (margin + ((tickPosition.subtract(minValue)).doubleValue() / (maxValue.subtract(minValue)).doubleValue() * tickSpace));
-      tickLocations.add(tickLabelPosition);
-    }
-  }
-
-  /**
-   * Determine the grid step for the data set given the space in pixels allocated for the axis
-   * 
-   * @param tickSpace in plot space
-   * @return
-   */
-  private BigDecimal getGridStep(int tickSpace) {
-
     // the span of the data
     long span = Math.abs(maxValue.subtract(minValue).longValue()); // in data space
 
@@ -103,7 +75,16 @@ public class DateAxisTickCalculator extends AxisTickCalculator {
       }
     }
 
-    return gridStep;
+    BigDecimal firstPosition = getFirstPosition(gridStep);
+
+    // generate all tickLabels and tickLocations from the first to last position
+    for (BigDecimal tickPosition = firstPosition; tickPosition.compareTo(maxValue) <= 0; tickPosition = tickPosition.add(gridStep)) {
+
+      tickLabels.add(dateFormatter.formatDate(tickPosition, timeUnit));
+      // here we convert tickPosition finally to plot space, i.e. pixels
+      int tickLabelPosition = (int) (margin + ((tickPosition.subtract(minValue)).doubleValue() / (maxValue.subtract(minValue)).doubleValue() * tickSpace));
+      tickLocations.add(tickLabelPosition);
+    }
   }
 
 }
diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/axistickcalculator/DateFormatter.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/axistickcalculator/DateFormatter.java
index d1d6ba7133212f974fabd56d4d6138a3fd31449b..e94786e923b9aaa54b1d86a7bce4c95a9698c88e 100644
--- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/axistickcalculator/DateFormatter.java
+++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/axistickcalculator/DateFormatter.java
@@ -44,7 +44,6 @@ public class DateFormatter {
   public static final long YEAR_SCALE = TimeUnit.DAYS.toMillis(1L) * 365;
 
   private Map<Long, int[]> validTickStepsMap;
-  private long timeUnit;
 
   private final StyleManager styleManager;
 
@@ -87,7 +86,7 @@ public class DateFormatter {
    * @param max
    * @return
    */
-  String formatDate(BigDecimal value) {
+  String formatDate(BigDecimal value, long timeUnit) {
 
     String datePattern;