From 6a4571286cd12d919ce5e43b8649da7bbdabfac2 Mon Sep 17 00:00:00 2001
From: Tim Molter <tim.molter@gmail.com>
Date: Thu, 21 Feb 2013 09:23:46 +0100
Subject: [PATCH] added logarithmic axes

---
 .../com/xeiam/xchart/demo/XChartDemo.java     |   3 +
 .../demo/charts/{line => }/ExampleChart.java  |   4 +-
 .../xchart/demo/charts/area/AreaChart01.java  |   2 +-
 .../xchart/demo/charts/bar/BarChart01.java    |   2 +-
 .../xchart/demo/charts/date/DateChart01.java  |   4 +-
 .../xchart/demo/charts/date/DateChart02.java  |   4 +-
 .../xchart/demo/charts/date/DateChart03.java  |   4 +-
 .../xchart/demo/charts/date/DateChart04.java  |   4 +-
 .../xchart/demo/charts/date/DateChart05.java  |   4 +-
 .../xchart/demo/charts/date/DateChart06.java  |   4 +-
 .../xchart/demo/charts/date/DateChart07.java  |   4 +-
 .../xchart/demo/charts/line/LineChart01.java  |   3 +-
 .../xchart/demo/charts/line/LineChart02.java  |   3 +-
 .../xchart/demo/charts/line/LineChart03.java  |   1 +
 .../xchart/demo/charts/line/LineChart05.java  |   1 +
 .../xchart/demo/charts/line/LineChart06.java  |   1 +
 .../xchart/demo/charts/line/LineChart07.java  |   1 +
 .../xchart/demo/charts/line/LineChart08.java  |   3 +-
 .../xchart/demo/charts/line/LineChart09.java  |   3 +-
 .../xchart/demo/charts/line/LineChart10.java  |   3 +-
 .../xchart/demo/charts/line/LineChart11.java  |   1 +
 .../demo/charts/scatter/ScatterChart01.java   |   2 +-
 .../demo/charts/scatter/ScatterChart02.java   |  76 +++++++++++
 .../src/main/java/com/xeiam/xchart/Chart.java |   1 -
 .../java/com/xeiam/xchart/QuickChart.java     |   1 -
 .../com/xeiam/xchart/{style => }/Series.java  |   6 +-
 .../xchart/internal/chartpart/AxisPair.java   |   2 +-
 .../xchart/internal/chartpart/AxisTick.java   |  11 +-
 .../internal/chartpart/AxisTickLabels.java    |  14 +-
 .../xchart/internal/chartpart/Legend.java     |   2 +-
 .../internal/chartpart/PlotContent.java       |  19 ++-
 .../AxisTickCalculator.java                   |  83 ++++--------
 .../DateAxisTickCalculator.java               |  22 +---
 .../LogarithmicAxisTickCalculator.java        | 122 ++++++------------
 .../NumberAxisTickCalculator.java             |  40 +-----
 .../xeiam/xchart/style/SeriesLineStyle.java   |   2 +-
 .../com/xeiam/xchart/style/StyleManager.java  |  34 +++++
 .../java/com/xeiam/xchart/chart/Example2.java |   2 +-
 .../java/com/xeiam/xchart/chart/NoBug.java    |   2 +-
 .../xeiam/xchart/unit/ValueFormatterTest.java |  36 +++---
 40 files changed, 278 insertions(+), 258 deletions(-)
 rename xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/{line => }/ExampleChart.java (96%)
 create mode 100644 xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/scatter/ScatterChart02.java
 rename xchart/src/main/java/com/xeiam/xchart/{style => }/Series.java (96%)

diff --git a/xchart-demo/src/main/java/com/xeiam/xchart/demo/XChartDemo.java b/xchart-demo/src/main/java/com/xeiam/xchart/demo/XChartDemo.java
index ce69b6b9..45c335b6 100644
--- a/xchart-demo/src/main/java/com/xeiam/xchart/demo/XChartDemo.java
+++ b/xchart-demo/src/main/java/com/xeiam/xchart/demo/XChartDemo.java
@@ -48,6 +48,7 @@ import com.xeiam.xchart.demo.charts.line.LineChart09;
 import com.xeiam.xchart.demo.charts.line.LineChart10;
 import com.xeiam.xchart.demo.charts.line.LineChart11;
 import com.xeiam.xchart.demo.charts.scatter.ScatterChart01;
+import com.xeiam.xchart.demo.charts.scatter.ScatterChart02;
 
 /**
  * Class containing all XChart example charts
@@ -173,6 +174,8 @@ public class XChartDemo extends JPanel implements TreeSelectionListener {
 
     chart = new DefaultMutableTreeNode(new ChartInfo("ScatterChart01 - Gaussian Blob", new ScatterChart01().getChart()));
     category.add(chart);
+    chart = new DefaultMutableTreeNode(new ChartInfo("ScatterChart02 - Logarithmic Data", new ScatterChart02().getChart()));
+    category.add(chart);
 
     // Area category
     category = new DefaultMutableTreeNode("Area Charts");
diff --git a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/line/ExampleChart.java b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/ExampleChart.java
similarity index 96%
rename from xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/line/ExampleChart.java
rename to xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/ExampleChart.java
index cfe44b64..7e26d815 100644
--- a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/line/ExampleChart.java
+++ b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/ExampleChart.java
@@ -19,12 +19,10 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  * SOFTWARE.
  */
-package com.xeiam.xchart.demo.charts.line;
+package com.xeiam.xchart.demo.charts;
 
 import com.xeiam.xchart.Chart;
 
-/**
- */
 public interface ExampleChart {
 
   public Chart getChart();
diff --git a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/area/AreaChart01.java b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/area/AreaChart01.java
index 7e36c715..2176779e 100644
--- a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/area/AreaChart01.java
+++ b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/area/AreaChart01.java
@@ -18,7 +18,7 @@ package com.xeiam.xchart.demo.charts.area;
 import com.xeiam.xchart.Chart;
 import com.xeiam.xchart.ChartBuilder;
 import com.xeiam.xchart.SwingWrapper;
-import com.xeiam.xchart.demo.charts.line.ExampleChart;
+import com.xeiam.xchart.demo.charts.ExampleChart;
 import com.xeiam.xchart.style.StyleManager.ChartType;
 import com.xeiam.xchart.style.StyleManager.LegendPosition;
 
diff --git a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/bar/BarChart01.java b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/bar/BarChart01.java
index 1b23ded0..24b32ea7 100644
--- a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/bar/BarChart01.java
+++ b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/bar/BarChart01.java
@@ -24,7 +24,7 @@ package com.xeiam.xchart.demo.charts.bar;
 import com.xeiam.xchart.Chart;
 import com.xeiam.xchart.ChartBuilder;
 import com.xeiam.xchart.SwingWrapper;
-import com.xeiam.xchart.demo.charts.line.ExampleChart;
+import com.xeiam.xchart.demo.charts.ExampleChart;
 import com.xeiam.xchart.style.StyleManager.ChartType;
 import com.xeiam.xchart.style.StyleManager.LegendPosition;
 
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 d0194a96..d100041d 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,9 +24,9 @@ import java.util.Date;
 import java.util.Random;
 
 import com.xeiam.xchart.Chart;
+import com.xeiam.xchart.Series;
 import com.xeiam.xchart.SwingWrapper;
-import com.xeiam.xchart.demo.charts.line.ExampleChart;
-import com.xeiam.xchart.style.Series;
+import com.xeiam.xchart.demo.charts.ExampleChart;
 
 /**
  * Millisecond scale
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 fd2db2f1..00d1e956 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,9 +24,9 @@ import java.util.Date;
 import java.util.Random;
 
 import com.xeiam.xchart.Chart;
+import com.xeiam.xchart.Series;
 import com.xeiam.xchart.SwingWrapper;
-import com.xeiam.xchart.demo.charts.line.ExampleChart;
-import com.xeiam.xchart.style.Series;
+import com.xeiam.xchart.demo.charts.ExampleChart;
 
 /**
  * Second scale
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 157d8215..b13aaacc 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,9 +24,9 @@ import java.util.Date;
 import java.util.Random;
 
 import com.xeiam.xchart.Chart;
+import com.xeiam.xchart.Series;
 import com.xeiam.xchart.SwingWrapper;
-import com.xeiam.xchart.demo.charts.line.ExampleChart;
-import com.xeiam.xchart.style.Series;
+import com.xeiam.xchart.demo.charts.ExampleChart;
 
 /**
  * Minute scale
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 cf0ae770..bb3e9901 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,9 +24,9 @@ import java.util.Date;
 import java.util.Random;
 
 import com.xeiam.xchart.Chart;
+import com.xeiam.xchart.Series;
 import com.xeiam.xchart.SwingWrapper;
-import com.xeiam.xchart.demo.charts.line.ExampleChart;
-import com.xeiam.xchart.style.Series;
+import com.xeiam.xchart.demo.charts.ExampleChart;
 
 /**
  * Hour scale
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 b71be652..7277b3b8 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,9 +24,9 @@ import java.util.Date;
 import java.util.Random;
 
 import com.xeiam.xchart.Chart;
+import com.xeiam.xchart.Series;
 import com.xeiam.xchart.SwingWrapper;
-import com.xeiam.xchart.demo.charts.line.ExampleChart;
-import com.xeiam.xchart.style.Series;
+import com.xeiam.xchart.demo.charts.ExampleChart;
 
 /**
  * Day scale
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 09d66139..c574840c 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,9 +24,9 @@ import java.util.Date;
 import java.util.Random;
 
 import com.xeiam.xchart.Chart;
+import com.xeiam.xchart.Series;
 import com.xeiam.xchart.SwingWrapper;
-import com.xeiam.xchart.demo.charts.line.ExampleChart;
-import com.xeiam.xchart.style.Series;
+import com.xeiam.xchart.demo.charts.ExampleChart;
 
 /**
  * Month scale
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 0a7b999b..305fd2f0 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,9 +24,9 @@ import java.util.Date;
 import java.util.Random;
 
 import com.xeiam.xchart.Chart;
+import com.xeiam.xchart.Series;
 import com.xeiam.xchart.SwingWrapper;
-import com.xeiam.xchart.demo.charts.line.ExampleChart;
-import com.xeiam.xchart.style.Series;
+import com.xeiam.xchart.demo.charts.ExampleChart;
 
 /**
  * Year scale
diff --git a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/line/LineChart01.java b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/line/LineChart01.java
index 2291ad4a..2c40b189 100644
--- a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/line/LineChart01.java
+++ b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/line/LineChart01.java
@@ -19,8 +19,9 @@ import java.util.Arrays;
 import java.util.Collection;
 
 import com.xeiam.xchart.Chart;
+import com.xeiam.xchart.Series;
 import com.xeiam.xchart.SwingWrapper;
-import com.xeiam.xchart.style.Series;
+import com.xeiam.xchart.demo.charts.ExampleChart;
 import com.xeiam.xchart.style.SeriesMarker;
 
 /**
diff --git a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/line/LineChart02.java b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/line/LineChart02.java
index e1b558d8..19c78112 100644
--- a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/line/LineChart02.java
+++ b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/line/LineChart02.java
@@ -19,8 +19,9 @@ import java.util.ArrayList;
 import java.util.List;
 
 import com.xeiam.xchart.Chart;
+import com.xeiam.xchart.Series;
 import com.xeiam.xchart.SwingWrapper;
-import com.xeiam.xchart.style.Series;
+import com.xeiam.xchart.demo.charts.ExampleChart;
 import com.xeiam.xchart.style.SeriesColor;
 import com.xeiam.xchart.style.SeriesLineStyle;
 import com.xeiam.xchart.style.SeriesMarker;
diff --git a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/line/LineChart03.java b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/line/LineChart03.java
index 3404c6e8..d2e7afbb 100644
--- a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/line/LineChart03.java
+++ b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/line/LineChart03.java
@@ -20,6 +20,7 @@ import java.util.Collection;
 
 import com.xeiam.xchart.Chart;
 import com.xeiam.xchart.SwingWrapper;
+import com.xeiam.xchart.demo.charts.ExampleChart;
 
 /**
  * Multiple curves on one Chart
diff --git a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/line/LineChart05.java b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/line/LineChart05.java
index ca77de2e..b8abf222 100644
--- a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/line/LineChart05.java
+++ b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/line/LineChart05.java
@@ -18,6 +18,7 @@ package com.xeiam.xchart.demo.charts.line;
 import com.xeiam.xchart.Chart;
 import com.xeiam.xchart.ChartBuilder;
 import com.xeiam.xchart.SwingWrapper;
+import com.xeiam.xchart.demo.charts.ExampleChart;
 import com.xeiam.xchart.style.theme.GGPlot2Theme;
 
 /**
diff --git a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/line/LineChart06.java b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/line/LineChart06.java
index de073739..a49c0b17 100644
--- a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/line/LineChart06.java
+++ b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/line/LineChart06.java
@@ -17,6 +17,7 @@ package com.xeiam.xchart.demo.charts.line;
 
 import com.xeiam.xchart.Chart;
 import com.xeiam.xchart.SwingWrapper;
+import com.xeiam.xchart.demo.charts.ExampleChart;
 
 /**
  * Single point
diff --git a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/line/LineChart07.java b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/line/LineChart07.java
index 1e54855e..e1c39758 100644
--- a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/line/LineChart07.java
+++ b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/line/LineChart07.java
@@ -20,6 +20,7 @@ import java.util.Collection;
 
 import com.xeiam.xchart.Chart;
 import com.xeiam.xchart.SwingWrapper;
+import com.xeiam.xchart.demo.charts.ExampleChart;
 
 /**
  * Longs as X-Axis data
diff --git a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/line/LineChart08.java b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/line/LineChart08.java
index 1d025112..0191eee1 100644
--- a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/line/LineChart08.java
+++ b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/line/LineChart08.java
@@ -19,8 +19,9 @@ import java.util.ArrayList;
 import java.util.Collection;
 
 import com.xeiam.xchart.Chart;
+import com.xeiam.xchart.Series;
 import com.xeiam.xchart.SwingWrapper;
-import com.xeiam.xchart.style.Series;
+import com.xeiam.xchart.demo.charts.ExampleChart;
 import com.xeiam.xchart.style.SeriesColor;
 import com.xeiam.xchart.style.SeriesLineStyle;
 import com.xeiam.xchart.style.SeriesMarker;
diff --git a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/line/LineChart09.java b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/line/LineChart09.java
index c91f5353..701ee74e 100644
--- a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/line/LineChart09.java
+++ b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/line/LineChart09.java
@@ -26,9 +26,10 @@ import java.util.Date;
 import java.util.Locale;
 
 import com.xeiam.xchart.Chart;
+import com.xeiam.xchart.Series;
 import com.xeiam.xchart.SwingWrapper;
+import com.xeiam.xchart.demo.charts.ExampleChart;
 import com.xeiam.xchart.style.ChartColor;
-import com.xeiam.xchart.style.Series;
 import com.xeiam.xchart.style.SeriesColor;
 import com.xeiam.xchart.style.SeriesLineStyle;
 import com.xeiam.xchart.style.SeriesMarker;
diff --git a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/line/LineChart10.java b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/line/LineChart10.java
index 2b56b2d3..479af8b0 100644
--- a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/line/LineChart10.java
+++ b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/line/LineChart10.java
@@ -16,8 +16,9 @@
 package com.xeiam.xchart.demo.charts.line;
 
 import com.xeiam.xchart.Chart;
+import com.xeiam.xchart.Series;
 import com.xeiam.xchart.SwingWrapper;
-import com.xeiam.xchart.style.Series;
+import com.xeiam.xchart.demo.charts.ExampleChart;
 import com.xeiam.xchart.style.SeriesColor;
 import com.xeiam.xchart.style.SeriesLineStyle;
 import com.xeiam.xchart.style.SeriesMarker;
diff --git a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/line/LineChart11.java b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/line/LineChart11.java
index e42a0195..f2b3ba56 100644
--- a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/line/LineChart11.java
+++ b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/line/LineChart11.java
@@ -18,6 +18,7 @@ package com.xeiam.xchart.demo.charts.line;
 import com.xeiam.xchart.Chart;
 import com.xeiam.xchart.ChartBuilder;
 import com.xeiam.xchart.SwingWrapper;
+import com.xeiam.xchart.demo.charts.ExampleChart;
 
 /**
  * Using ChartBuilder to Make a Chart
diff --git a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/scatter/ScatterChart01.java b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/scatter/ScatterChart01.java
index 9b8dadf1..3883fe6a 100644
--- a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/scatter/ScatterChart01.java
+++ b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/scatter/ScatterChart01.java
@@ -21,7 +21,7 @@ import java.util.Random;
 
 import com.xeiam.xchart.Chart;
 import com.xeiam.xchart.SwingWrapper;
-import com.xeiam.xchart.demo.charts.line.ExampleChart;
+import com.xeiam.xchart.demo.charts.ExampleChart;
 import com.xeiam.xchart.style.StyleManager.ChartType;
 
 /**
diff --git a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/scatter/ScatterChart02.java b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/scatter/ScatterChart02.java
new file mode 100644
index 00000000..1dd23506
--- /dev/null
+++ b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/scatter/ScatterChart02.java
@@ -0,0 +1,76 @@
+/**
+ * Copyright 2011-2013 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.demo.charts.scatter;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+import com.xeiam.xchart.Chart;
+import com.xeiam.xchart.SwingWrapper;
+import com.xeiam.xchart.demo.charts.ExampleChart;
+import com.xeiam.xchart.style.StyleManager.ChartType;
+import com.xeiam.xchart.style.StyleManager.LegendPosition;
+
+/**
+ * Logarithmic Data
+ * <p>
+ * Demonstrates the following:
+ * <ul>
+ * <li>Scatter chart
+ * <li>Logarithmic X-Axis
+ * <li>Place legend at Inside-NW position
+ * 
+ * @author timmolter
+ */
+public class ScatterChart02 implements ExampleChart {
+
+  public static void main(String[] args) {
+
+    ExampleChart exampleChart = new ScatterChart02();
+    Chart chart = exampleChart.getChart();
+    new SwingWrapper(chart).displayChart();
+  }
+
+  @Override
+  public Chart getChart() {
+
+    List<Number> xData = new ArrayList<Number>();
+    List<Number> yData = new ArrayList<Number>();
+    Random random = new Random();
+    int size = 400;
+    for (int i = 0; i < size; i++) {
+      double nextRandom = random.nextDouble();
+      xData.add(Math.pow(10, nextRandom * 10));
+      yData.add(nextRandom + random.nextDouble());
+    }
+
+    // Create Chart
+    Chart chart = new Chart(800, 600);
+    chart.setChartTitle("Logarithmic Data");
+    chart.getStyleManager().setChartType(ChartType.Scatter);
+    chart.getStyleManager().setXAxisLogarithmic(true);
+
+    // Customize Chart
+    chart.getStyleManager().setLegendPosition(LegendPosition.InsideNW);
+
+    // Series
+    chart.addSeries("logarithmic data", xData, yData);
+
+    return chart;
+  }
+
+}
diff --git a/xchart/src/main/java/com/xeiam/xchart/Chart.java b/xchart/src/main/java/com/xeiam/xchart/Chart.java
index 17e51c29..ac5fa6df 100644
--- a/xchart/src/main/java/com/xeiam/xchart/Chart.java
+++ b/xchart/src/main/java/com/xeiam/xchart/Chart.java
@@ -25,7 +25,6 @@ import com.xeiam.xchart.internal.chartpart.AxisPair;
 import com.xeiam.xchart.internal.chartpart.ChartTitle;
 import com.xeiam.xchart.internal.chartpart.Legend;
 import com.xeiam.xchart.internal.chartpart.Plot;
-import com.xeiam.xchart.style.Series;
 import com.xeiam.xchart.style.StyleManager;
 import com.xeiam.xchart.style.theme.Theme;
 
diff --git a/xchart/src/main/java/com/xeiam/xchart/QuickChart.java b/xchart/src/main/java/com/xeiam/xchart/QuickChart.java
index 2d4249b0..7450bc0c 100644
--- a/xchart/src/main/java/com/xeiam/xchart/QuickChart.java
+++ b/xchart/src/main/java/com/xeiam/xchart/QuickChart.java
@@ -17,7 +17,6 @@ package com.xeiam.xchart;
 
 import java.util.Collection;
 
-import com.xeiam.xchart.style.Series;
 import com.xeiam.xchart.style.SeriesMarker;
 
 /**
diff --git a/xchart/src/main/java/com/xeiam/xchart/style/Series.java b/xchart/src/main/java/com/xeiam/xchart/Series.java
similarity index 96%
rename from xchart/src/main/java/com/xeiam/xchart/style/Series.java
rename to xchart/src/main/java/com/xeiam/xchart/Series.java
index e701cd7d..638ee8ad 100644
--- a/xchart/src/main/java/com/xeiam/xchart/style/Series.java
+++ b/xchart/src/main/java/com/xeiam/xchart/Series.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.xeiam.xchart.style;
+package com.xeiam.xchart;
 
 import java.awt.BasicStroke;
 import java.awt.Color;
@@ -24,6 +24,10 @@ import java.util.Iterator;
 
 import com.xeiam.xchart.internal.chartpart.Axis.AxisType;
 import com.xeiam.xchart.internal.markers.Marker;
+import com.xeiam.xchart.style.SeriesColor;
+import com.xeiam.xchart.style.SeriesColorMarkerLineStyle;
+import com.xeiam.xchart.style.SeriesLineStyle;
+import com.xeiam.xchart.style.SeriesMarker;
 
 /**
  * A Series containing X and Y data to be plotted on a Chart
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 668b6559..7d7e08f2 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
@@ -25,8 +25,8 @@ import java.util.LinkedHashMap;
 import java.util.Map;
 
 import com.xeiam.xchart.Chart;
+import com.xeiam.xchart.Series;
 import com.xeiam.xchart.internal.chartpart.Axis.AxisType;
-import com.xeiam.xchart.style.Series;
 import com.xeiam.xchart.style.SeriesColorMarkerLineStyleCycler;
 
 /**
diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTick.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTick.java
index 3274a342..c0a96ea1 100644
--- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTick.java
+++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTick.java
@@ -23,6 +23,7 @@ import com.xeiam.xchart.Chart;
 import com.xeiam.xchart.internal.chartpart.Axis.AxisType;
 import com.xeiam.xchart.internal.chartpart.axistickcalculator.AxisTickCalculator;
 import com.xeiam.xchart.internal.chartpart.axistickcalculator.DateAxisTickCalculator;
+import com.xeiam.xchart.internal.chartpart.axistickcalculator.LogarithmicAxisTickCalculator;
 import com.xeiam.xchart.internal.chartpart.axistickcalculator.NumberAxisTickCalculator;
 
 /**
@@ -81,7 +82,15 @@ public class AxisTick implements ChartPart {
       // System.out.println("workingspace= " + workingSpace);
     }
 
-    if (axis.getAxisType() == AxisType.Number) {
+    if (axis.getDirection() == Axis.Direction.X && getChart().getStyleManager().isXAxisLogarithmic() && axis.getAxisType() != AxisType.Date) {
+
+      gridStep = new LogarithmicAxisTickCalculator(axis.getDirection(), workingSpace, axis.getMin(), axis.getMax(), getChart().getStyleManager());
+
+    } else if (axis.getDirection() == Axis.Direction.Y && getChart().getStyleManager().isYAxisLogarithmic() && axis.getAxisType() != AxisType.Date) {
+
+      gridStep = new LogarithmicAxisTickCalculator(axis.getDirection(), workingSpace, axis.getMin(), axis.getMax(), getChart().getStyleManager());
+
+    } else if (axis.getAxisType() == AxisType.Number) {
 
       gridStep = new NumberAxisTickCalculator(axis.getDirection(), workingSpace, axis.getMin(), axis.getMax(), getChart().getStyleManager());
 
diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTickLabels.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTickLabels.java
index 2cbabd21..c40585e8 100644
--- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTickLabels.java
+++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTickLabels.java
@@ -95,12 +95,14 @@ public class AxisTickLabels implements ChartPart {
         int tickLocation = axisTick.getTickLocations().get(i);
 
         FontRenderContext frc = g.getFontRenderContext();
-        TextLayout layout = new TextLayout(tickLabel, getChart().getStyleManager().getAxisTickLabelsFont(), frc);
-        Rectangle tickLabelBounds = layout.getPixelBounds(null, 0, 0);
-        layout.draw(g, (int) (xOffset + tickLocation - tickLabelBounds.getWidth() / 2.0), yOffset);
-
-        if (tickLabelBounds.getHeight() > maxTickLabelHeight) {
-          maxTickLabelHeight = (int) tickLabelBounds.getHeight();
+        if (tickLabel != null) { // some are null for logarithmic axes
+          TextLayout layout = new TextLayout(tickLabel, getChart().getStyleManager().getAxisTickLabelsFont(), frc);
+          Rectangle tickLabelBounds = layout.getPixelBounds(null, 0, 0);
+          layout.draw(g, (int) (xOffset + tickLocation - tickLabelBounds.getWidth() / 2.0), yOffset);
+
+          if (tickLabelBounds.getHeight() > maxTickLabelHeight) {
+            maxTickLabelHeight = (int) tickLabelBounds.getHeight();
+          }
         }
       }
 
diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/Legend.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/Legend.java
index 70c99f17..2a1dc924 100644
--- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/Legend.java
+++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/Legend.java
@@ -22,8 +22,8 @@ import java.awt.font.TextLayout;
 import java.util.Map;
 
 import com.xeiam.xchart.Chart;
+import com.xeiam.xchart.Series;
 import com.xeiam.xchart.internal.markers.Marker;
-import com.xeiam.xchart.style.Series;
 
 /**
  * @author timmolter
diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/PlotContent.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/PlotContent.java
index 86f9aa01..425a84d4 100644
--- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/PlotContent.java
+++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/PlotContent.java
@@ -26,8 +26,8 @@ import java.util.Iterator;
 import java.util.Map;
 
 import com.xeiam.xchart.Chart;
+import com.xeiam.xchart.Series;
 import com.xeiam.xchart.internal.chartpart.Axis.AxisType;
-import com.xeiam.xchart.style.Series;
 import com.xeiam.xchart.style.StyleManager.ChartType;
 
 /**
@@ -78,9 +78,17 @@ public class PlotContent implements ChartPart {
       Collection<?> xData = series.getxData();
       BigDecimal xMin = getChart().getAxisPair().getxAxis().getMin();
       BigDecimal xMax = getChart().getAxisPair().getxAxis().getMax();
+      if (getChart().getStyleManager().isXAxisLogarithmic()) {
+        xMin = new BigDecimal(Math.log10(xMin.doubleValue()));
+        xMax = new BigDecimal(Math.log10(xMax.doubleValue()));
+      }
       Collection<Number> yData = series.getyData();
       BigDecimal yMin = getChart().getAxisPair().getyAxis().getMin();
       BigDecimal yMax = getChart().getAxisPair().getyAxis().getMax();
+      if (getChart().getStyleManager().isYAxisLogarithmic()) {
+        yMin = new BigDecimal(Math.log10(yMin.doubleValue()));
+        yMax = new BigDecimal(Math.log10(yMax.doubleValue()));
+      }
       Collection<Number> errorBars = series.getErrorBars();
 
       int previousX = Integer.MIN_VALUE;
@@ -103,7 +111,16 @@ public class PlotContent implements ChartPart {
           // System.out.println(x);
         }
 
+        if (getChart().getStyleManager().isXAxisLogarithmic()) {
+          x = new BigDecimal(Math.log10(x.doubleValue()));
+        }
+
         BigDecimal y = new BigDecimal(yItr.next().doubleValue());
+
+        if (getChart().getStyleManager().isYAxisLogarithmic()) {
+          y = new BigDecimal(Math.log10(y.doubleValue()));
+        }
+
         // System.out.println(y);
         double eb = 0.0;
         if (errorBars != null) {
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 efacecbd..2dc8b452 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
@@ -27,7 +27,6 @@ import java.text.NumberFormat;
 import java.util.LinkedList;
 import java.util.List;
 
-import com.xeiam.xchart.internal.chartpart.Axis.AxisType;
 import com.xeiam.xchart.internal.chartpart.Axis.Direction;
 import com.xeiam.xchart.style.StyleManager;
 
@@ -58,6 +57,15 @@ public abstract class AxisTickCalculator {
 
   protected final StyleManager styleManager;
 
+  /**
+   * Constructor
+   * 
+   * @param axisDirection
+   * @param workingSpace
+   * @param minValue
+   * @param maxValue
+   * @param styleManager
+   */
   public AxisTickCalculator(Direction axisDirection, int workingSpace, BigDecimal minValue, BigDecimal maxValue, StyleManager styleManager) {
 
     this.axisDirection = axisDirection;
@@ -65,63 +73,15 @@ public abstract class AxisTickCalculator {
     this.minValue = minValue;
     this.maxValue = maxValue;
     this.styleManager = styleManager;
-
   }
 
-  BigDecimal getGridStepDecimal(double gridStepHint) {
-
-    // gridStepHint --> significand * 10 ** exponent
-    // e.g. 724.1 --> 7.241 * 10 ** 2
-    double significand = gridStepHint;
-    int exponent = 0;
-    if (significand == 0) {
-      exponent = 1;
-    } else if (significand < 1) {
-      while (significand < 1) {
-        significand *= 10.0;
-        exponent--;
-      }
-    } else {
-      while (significand >= 10) {
-        significand /= 10.0;
-        exponent++;
-      }
-    }
+  BigDecimal pow(double base, int exponent) {
 
-    // calculate the grid step with hint.
-    BigDecimal gridStep;
-    if (significand > 7.5) {
-      // gridStep = 10.0 * 10 ** exponent
-      gridStep = BigDecimal.TEN.multiply(pow(10, exponent));
-    } else if (significand > 3.5) {
-      // gridStep = 5.0 * 10 ** exponent
-      gridStep = new BigDecimal(new Double(5).toString()).multiply(pow(10, exponent));
-    } else if (significand > 1.5) {
-      // gridStep = 2.0 * 10 ** exponent
-      gridStep = new BigDecimal(new Double(2).toString()).multiply(pow(10, exponent));
-    } else {
-      // gridStep = 1.0 * 10 ** exponent
-      gridStep = pow(10, exponent);
-    }
-    return gridStep;
-  }
-
-  /**
-   * Calculates the value of the first argument raised to the power of the second argument.
-   * 
-   * @param base the base
-   * @param exponent the exponent
-   * @return the value <tt>a<sup>b</sup></tt> in <tt>BigDecimal</tt>
-   */
-  private BigDecimal pow(double base, int exponent) {
-
-    BigDecimal value;
     if (exponent > 0) {
-      value = new BigDecimal(new Double(base).toString()).pow(exponent);
+      return new BigDecimal(base).pow(exponent);
     } else {
-      value = BigDecimal.ONE.divide(new BigDecimal(new Double(base).toString()).pow(-exponent));
+      return BigDecimal.ONE.divide(new BigDecimal(base).pow(-exponent));
     }
-    return value;
   }
 
   /**
@@ -152,6 +112,17 @@ public abstract class AxisTickCalculator {
 
   }
 
+  BigDecimal getFirstPosition(final BigDecimal min, BigDecimal gridStep) {
+
+    BigDecimal firstPosition;
+    if (min.remainder(gridStep).doubleValue() <= 0.0) {
+      firstPosition = min.subtract(min.remainder(gridStep));
+    } else {
+      firstPosition = min.subtract(min.remainder(gridStep)).add(gridStep);
+    }
+    return firstPosition;
+  }
+
   public List<Integer> getTickLocations() {
 
     return tickLocations;
@@ -162,10 +133,8 @@ public abstract class AxisTickCalculator {
     return tickLabels;
   }
 
-  public abstract BigDecimal getGridStep(int tickSpace);
-
-  public abstract BigDecimal getFirstPosition(BigDecimal minValue, BigDecimal gridStep);
-
-  public abstract AxisType getAxisType();
+  // public abstract BigDecimal getGridStep(int tickSpace);
+  //
+  // public abstract BigDecimal getFirstPosition(BigDecimal minValue, BigDecimal gridStep);
 
 }
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 eb51da94..0397b811 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
@@ -28,7 +28,6 @@ import java.util.Map.Entry;
 import java.util.TreeMap;
 import java.util.concurrent.TimeUnit;
 
-import com.xeiam.xchart.internal.chartpart.Axis.AxisType;
 import com.xeiam.xchart.internal.chartpart.Axis.Direction;
 import com.xeiam.xchart.internal.chartpart.AxisPair;
 import com.xeiam.xchart.style.StyleManager;
@@ -109,8 +108,7 @@ public class DateAxisTickCalculator extends AxisTickCalculator {
    * @param tickSpace in plot space
    * @return
    */
-  @Override
-  public BigDecimal getGridStep(int tickSpace) {
+  private BigDecimal getGridStep(int tickSpace) {
 
     // the span of the data
     long span = Math.abs(maxValue.subtract(minValue).longValue()); // in data space
@@ -130,18 +128,6 @@ public class DateAxisTickCalculator extends AxisTickCalculator {
     return gridStep;
   }
 
-  @Override
-  public BigDecimal getFirstPosition(final BigDecimal min, BigDecimal gridStep) {
-
-    BigDecimal firstPosition;
-    if (min.remainder(gridStep).doubleValue() <= 0.0) {
-      firstPosition = min.subtract(min.remainder(gridStep));
-    } else {
-      firstPosition = min.subtract(min.remainder(gridStep)).add(gridStep);
-    }
-    return firstPosition;
-  }
-
   private long getTimeUnit(long gridStepHint) {
 
     for (Entry<Long, int[]> entry : validTickStepsMap.entrySet()) {
@@ -193,10 +179,4 @@ public class DateAxisTickCalculator extends AxisTickCalculator {
     return simpleDateformat.format(value.longValueExact());
   }
 
-  @Override
-  public AxisType getAxisType() {
-
-    return AxisType.Date;
-  }
-
 }
diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/axistickcalculator/LogarithmicAxisTickCalculator.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/axistickcalculator/LogarithmicAxisTickCalculator.java
index 0ea90c66..92aafe7e 100644
--- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/axistickcalculator/LogarithmicAxisTickCalculator.java
+++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/axistickcalculator/LogarithmicAxisTickCalculator.java
@@ -23,12 +23,12 @@ package com.xeiam.xchart.internal.chartpart.axistickcalculator;
 
 import java.math.BigDecimal;
 
-import com.xeiam.xchart.internal.chartpart.Axis.AxisType;
 import com.xeiam.xchart.internal.chartpart.Axis.Direction;
+import com.xeiam.xchart.internal.chartpart.AxisPair;
 import com.xeiam.xchart.style.StyleManager;
 
 /**
- * This class encapsulates the logic to generate the axis tick mark and axis tick label data for rendering the axis ticks for decimal axes
+ * This class encapsulates the logic to generate the axis tick mark and axis tick label data for rendering the axis ticks for logarithmic axes
  * 
  * @author timmolter
  */
@@ -46,98 +46,56 @@ public class LogarithmicAxisTickCalculator extends AxisTickCalculator {
   public LogarithmicAxisTickCalculator(Direction axisDirection, int workingSpace, BigDecimal minValue, BigDecimal maxValue, StyleManager styleManager) {
 
     super(axisDirection, workingSpace, minValue, maxValue, styleManager);
+    calculate();
   }
 
-  /**
-   * Determine the grid step for the data set given the space in pixels allocated for the axis
-   * 
-   * @param tickSpace in plot space
-   * @return
-   */
-  @Override
-  public BigDecimal getGridStep(int tickSpace) {
+  private void calculate() {
 
-    // the span of the data
-    double span = Math.abs(maxValue.subtract(minValue).doubleValue()); // in data space
+    // a check if all axis data are the exact same values
+    if (minValue == maxValue) {
+      tickLabels.add(formatNumber(maxValue));
+      tickLocations.add((int) (workingSpace / 2.0));
+      return;
+    }
 
-    int tickMarkSpaceHint = (axisDirection == Direction.X ? DEFAULT_TICK_MARK_STEP_HINT_X : DEFAULT_TICK_MARK_STEP_HINT_Y);
+    // tick space - a percentage of the working space available for ticks, i.e. 95%
+    int tickSpace = AxisPair.getTickSpace(workingSpace); // in plot space
 
-    // for very short plots, squeeze some more ticks in than normal
-    if (axisDirection == Direction.Y && tickSpace < 160) {
-      tickMarkSpaceHint = 25;
-    }
+    // where the tick should begin in the working space in pixels
+    int margin = AxisPair.getTickStartOffset(workingSpace, tickSpace); // in plot space BigDecimal gridStep = getGridStepForDecimal(tickSpace);
 
-    double gridStepHint = span / tickSpace * tickMarkSpaceHint;
-
-    // gridStepHint --> significand * 10 ** exponent
-    // e.g. 724.1 --> 7.241 * 10 ** 2
-    double significand = gridStepHint;
-    int exponent = 0;
-    if (significand == 0) {
-      exponent = 1;
-    } else if (significand < 1) {
-      while (significand < 1) {
-        significand *= 10.0;
-        exponent--;
-      }
-    } else {
-      while (significand >= 10) {
-        significand /= 10.0;
-        exponent++;
-      }
-    }
+    int logMin = (int) Math.floor(Math.log10(minValue.doubleValue()));
+    int logMax = (int) Math.ceil(Math.log10(maxValue.doubleValue()));
 
-    // calculate the grid step with hint.
-    BigDecimal gridStep;
-    if (significand > 7.5) {
-      // gridStep = 10.0 * 10 ** exponent
-      gridStep = BigDecimal.TEN.multiply(pow(10, exponent));
-    } else if (significand > 3.5) {
-      // gridStep = 5.0 * 10 ** exponent
-      gridStep = new BigDecimal(new Double(5).toString()).multiply(pow(10, exponent));
-    } else if (significand > 1.5) {
-      // gridStep = 2.0 * 10 ** exponent
-      gridStep = new BigDecimal(new Double(2).toString()).multiply(pow(10, exponent));
-    } else {
-      // gridStep = 1.0 * 10 ** exponent
-      gridStep = pow(10, exponent);
-    }
-    return gridStep;
-  }
+    final BigDecimal min = new BigDecimal(minValue.doubleValue());
+    BigDecimal tickStep = pow(10, logMin - 1);
 
-  /**
-   * Calculates the value of the first argument raised to the power of the second argument.
-   * 
-   * @param base the base
-   * @param exponent the exponent
-   * @return the value <tt>a<sup>b</sup></tt> in <tt>BigDecimal</tt>
-   */
-  private BigDecimal pow(double base, int exponent) {
+    BigDecimal firstPosition = getFirstPosition(minValue, tickStep);
 
-    BigDecimal value;
-    if (exponent > 0) {
-      value = new BigDecimal(new Double(base).toString()).pow(exponent);
-    } else {
-      value = BigDecimal.ONE.divide(new BigDecimal(new Double(base).toString()).pow(-exponent));
-    }
-    return value;
-  }
+    for (int i = logMin; i <= logMax; i++) { // for each decade
 
-  @Override
-  public BigDecimal getFirstPosition(final BigDecimal min, BigDecimal gridStep) {
+      for (BigDecimal j = firstPosition; j.doubleValue() <= pow(10, i).doubleValue(); j = j.add(tickStep)) {
 
-    BigDecimal firstPosition;
-    if (min.remainder(gridStep).doubleValue() <= 0.0) {
-      firstPosition = min.subtract(min.remainder(gridStep));
-    } else {
-      firstPosition = min.subtract(min.remainder(gridStep)).add(gridStep);
-    }
-    return firstPosition;
-  }
+        // System.out.println(Math.log10(j.doubleValue()) % 1);
+
+        if (j.doubleValue() > maxValue.doubleValue()) {
+          break;
+        }
 
-  @Override
-  public AxisType getAxisType() {
+        // only add labels for the decades
+        if (Math.log10(j.doubleValue()) % 1 == 0.0) {
+          tickLabels.add(formatNumber(j));
+        } else {
+          tickLabels.add(null);
+        }
 
-    return AxisType.Number;
+        // add all the tick marks though
+        int tickLabelPosition = (int) (margin + (Math.log10(j.doubleValue()) - Math.log10(min.doubleValue())) / (Math.log10(maxValue.doubleValue()) - Math.log10(min.doubleValue())) * tickSpace);
+        tickLocations.add(tickLabelPosition);
+      }
+      tickStep = tickStep.multiply(pow(10, 1));
+      firstPosition = tickStep.add(pow(10, i));
+    }
   }
+
 }
diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/axistickcalculator/NumberAxisTickCalculator.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/axistickcalculator/NumberAxisTickCalculator.java
index 7f286d4d..55540bc0 100644
--- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/axistickcalculator/NumberAxisTickCalculator.java
+++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/axistickcalculator/NumberAxisTickCalculator.java
@@ -23,7 +23,6 @@ package com.xeiam.xchart.internal.chartpart.axistickcalculator;
 
 import java.math.BigDecimal;
 
-import com.xeiam.xchart.internal.chartpart.Axis.AxisType;
 import com.xeiam.xchart.internal.chartpart.Axis.Direction;
 import com.xeiam.xchart.internal.chartpart.AxisPair;
 import com.xeiam.xchart.style.StyleManager;
@@ -84,8 +83,7 @@ public class NumberAxisTickCalculator extends AxisTickCalculator {
    * @param tickSpace in plot space
    * @return
    */
-  @Override
-  public BigDecimal getGridStep(int tickSpace) {
+  private BigDecimal getGridStep(int tickSpace) {
 
     // the span of the data
     double span = Math.abs(maxValue.subtract(minValue).doubleValue()); // in data space
@@ -135,40 +133,4 @@ public class NumberAxisTickCalculator extends AxisTickCalculator {
     return gridStep;
   }
 
-  /**
-   * Calculates the value of the first argument raised to the power of the second argument.
-   * 
-   * @param base the base
-   * @param exponent the exponent
-   * @return the value <tt>a<sup>b</sup></tt> in <tt>BigDecimal</tt>
-   */
-  private BigDecimal pow(double base, int exponent) {
-
-    BigDecimal value;
-    if (exponent > 0) {
-      value = new BigDecimal(new Double(base).toString()).pow(exponent);
-    } else {
-      value = BigDecimal.ONE.divide(new BigDecimal(new Double(base).toString()).pow(-exponent));
-    }
-    return value;
-  }
-
-  @Override
-  public BigDecimal getFirstPosition(final BigDecimal min, BigDecimal gridStep) {
-
-    BigDecimal firstPosition;
-    if (min.remainder(gridStep).doubleValue() <= 0.0) {
-      firstPosition = min.subtract(min.remainder(gridStep));
-    } else {
-      firstPosition = min.subtract(min.remainder(gridStep)).add(gridStep);
-    }
-    return firstPosition;
-  }
-
-  @Override
-  public AxisType getAxisType() {
-
-    return AxisType.Number;
-  }
-
 }
diff --git a/xchart/src/main/java/com/xeiam/xchart/style/SeriesLineStyle.java b/xchart/src/main/java/com/xeiam/xchart/style/SeriesLineStyle.java
index 060ef115..f8a01980 100644
--- a/xchart/src/main/java/com/xeiam/xchart/style/SeriesLineStyle.java
+++ b/xchart/src/main/java/com/xeiam/xchart/style/SeriesLineStyle.java
@@ -83,7 +83,7 @@ public enum SeriesLineStyle {
    * @param seriesMarker
    * @return an AWT Stroke
    */
-  protected static BasicStroke getBasicStroke(SeriesLineStyle seriesMarker) {
+  public static BasicStroke getBasicStroke(SeriesLineStyle seriesMarker) {
 
     return seriesMarker.basicStroke;
   }
diff --git a/xchart/src/main/java/com/xeiam/xchart/style/StyleManager.java b/xchart/src/main/java/com/xeiam/xchart/style/StyleManager.java
index 00507e5f..b840eff4 100644
--- a/xchart/src/main/java/com/xeiam/xchart/style/StyleManager.java
+++ b/xchart/src/main/java/com/xeiam/xchart/style/StyleManager.java
@@ -84,6 +84,8 @@ public class StyleManager {
   private boolean isAxisTicksLineVisible;
   private int plotPadding;
   private int axisTitlePadding;
+  private boolean isXAxisLogarithmic;
+  private boolean isYAxisLogarithmic;
 
   // Chart Plot Area ///////////////////////////////
   private boolean isPlotGridLinesVisible;
@@ -149,6 +151,8 @@ public class StyleManager {
     isAxisTicksLineVisible = theme.isAxisTicksLineVisible();
     plotPadding = theme.getPlotPadding();
     axisTitlePadding = theme.getAxisTitlePadding();
+    isXAxisLogarithmic = false;
+    isYAxisLogarithmic = false;
 
     // Chart Plot Area ///////////////////////////////
     isPlotGridLinesVisible = theme.isPlotGridLinesVisible();
@@ -649,6 +653,36 @@ public class StyleManager {
     return axisTitlePadding;
   }
 
+  /**
+   * sets the X-Axis to be rendered with a logarithmic scale or not
+   * 
+   * @param isXAxisLogarithmic
+   */
+  public void setXAxisLogarithmic(boolean isXAxisLogarithmic) {
+
+    this.isXAxisLogarithmic = isXAxisLogarithmic;
+  }
+
+  public boolean isXAxisLogarithmic() {
+
+    return isXAxisLogarithmic;
+  }
+
+  /**
+   * sets the Y-Axis to be rendered with a logarithmic scale or not
+   * 
+   * @param isYAxisLogarithmic
+   */
+  public void setYAxisLogarithmic(boolean isYAxisLogarithmic) {
+
+    this.isYAxisLogarithmic = isYAxisLogarithmic;
+  }
+
+  public boolean isYAxisLogarithmic() {
+
+    return isYAxisLogarithmic;
+  }
+
   // Chart Plot Area ///////////////////////////////
 
   /**
diff --git a/xchart/src/test/java/com/xeiam/xchart/chart/Example2.java b/xchart/src/test/java/com/xeiam/xchart/chart/Example2.java
index 2a8f4b25..7561f5b4 100644
--- a/xchart/src/test/java/com/xeiam/xchart/chart/Example2.java
+++ b/xchart/src/test/java/com/xeiam/xchart/chart/Example2.java
@@ -20,8 +20,8 @@ import java.util.List;
 
 import com.xeiam.xchart.Chart;
 import com.xeiam.xchart.ChartBuilder;
+import com.xeiam.xchart.Series;
 import com.xeiam.xchart.SwingWrapper;
-import com.xeiam.xchart.style.Series;
 import com.xeiam.xchart.style.SeriesMarker;
 
 /**
diff --git a/xchart/src/test/java/com/xeiam/xchart/chart/NoBug.java b/xchart/src/test/java/com/xeiam/xchart/chart/NoBug.java
index e002be58..8a4832d3 100644
--- a/xchart/src/test/java/com/xeiam/xchart/chart/NoBug.java
+++ b/xchart/src/test/java/com/xeiam/xchart/chart/NoBug.java
@@ -25,8 +25,8 @@ import java.util.ArrayList;
 import java.util.List;
 
 import com.xeiam.xchart.Chart;
+import com.xeiam.xchart.Series;
 import com.xeiam.xchart.SwingWrapper;
-import com.xeiam.xchart.style.Series;
 
 /**
  * @author timmolter
diff --git a/xchart/src/test/java/com/xeiam/xchart/unit/ValueFormatterTest.java b/xchart/src/test/java/com/xeiam/xchart/unit/ValueFormatterTest.java
index 26aff9a6..020a6745 100644
--- a/xchart/src/test/java/com/xeiam/xchart/unit/ValueFormatterTest.java
+++ b/xchart/src/test/java/com/xeiam/xchart/unit/ValueFormatterTest.java
@@ -30,7 +30,7 @@ import java.util.Locale;
 import org.junit.Test;
 
 import com.xeiam.xchart.internal.chartpart.Axis.Direction;
-import com.xeiam.xchart.internal.chartpart.axistickcalculator.DateAxisTickCalculator;
+import com.xeiam.xchart.internal.chartpart.axistickcalculator.NumberAxisTickCalculator;
 import com.xeiam.xchart.style.StyleManager;
 
 /**
@@ -44,59 +44,59 @@ public class ValueFormatterTest {
   public void testNumberFormatting() {
 
     StyleManager styleManager = new StyleManager();
-    DateAxisTickCalculator dateAxisTickCalculator = new DateAxisTickCalculator(Direction.X, 1000, new BigDecimal(10), new BigDecimal(90), styleManager);
+    NumberAxisTickCalculator numberAxisTickCalculator = new NumberAxisTickCalculator(Direction.X, 1000, new BigDecimal(10), new BigDecimal(90), styleManager);
 
     // big
     styleManager.setLocale(locale);
 
     BigDecimal value = new BigDecimal("1");
-    String stringValue = dateAxisTickCalculator.formatNumber(value);
+    String stringValue = numberAxisTickCalculator.formatNumber(value);
     assertThat(stringValue, equalTo("1"));
 
     value = new BigDecimal(1000L);
-    stringValue = dateAxisTickCalculator.formatNumber(value);
+    stringValue = numberAxisTickCalculator.formatNumber(value);
     assertThat(stringValue, equalTo("1000"));
 
     value = new BigDecimal("9999");
-    stringValue = dateAxisTickCalculator.formatNumber(value);
+    stringValue = numberAxisTickCalculator.formatNumber(value);
     assertThat(stringValue, equalTo("9999"));
 
     value = new BigDecimal(20000L);
-    stringValue = dateAxisTickCalculator.formatNumber(value);
+    stringValue = numberAxisTickCalculator.formatNumber(value);
     assertThat(stringValue, equalTo("2E4"));
 
     value = new BigDecimal("200.23");
-    stringValue = dateAxisTickCalculator.formatNumber(value);
+    stringValue = numberAxisTickCalculator.formatNumber(value);
     assertThat(stringValue, equalTo("200.23"));
 
     // small
 
     value = new BigDecimal("0.01");
-    stringValue = dateAxisTickCalculator.formatNumber(value);
+    stringValue = numberAxisTickCalculator.formatNumber(value);
     assertThat(stringValue, equalTo("0.01"));
 
     value = new BigDecimal("0.001");
-    stringValue = dateAxisTickCalculator.formatNumber(value);
+    stringValue = numberAxisTickCalculator.formatNumber(value);
     assertThat(stringValue, equalTo("0.001"));
 
     value = new BigDecimal("0.0012");
-    stringValue = dateAxisTickCalculator.formatNumber(value);
+    stringValue = numberAxisTickCalculator.formatNumber(value);
     assertThat(stringValue, equalTo("0.0012"));
 
     value = new BigDecimal("0.0001");
-    stringValue = dateAxisTickCalculator.formatNumber(value);
+    stringValue = numberAxisTickCalculator.formatNumber(value);
     assertThat(stringValue, equalTo("1E-4"));
 
     value = new BigDecimal(".00012");
-    stringValue = dateAxisTickCalculator.formatNumber(value);
+    stringValue = numberAxisTickCalculator.formatNumber(value);
     assertThat(stringValue, equalTo("1.2E-4"));
 
     value = new BigDecimal("0.0");
-    stringValue = dateAxisTickCalculator.formatNumber(value);
+    stringValue = numberAxisTickCalculator.formatNumber(value);
     assertThat(stringValue, equalTo("0"));
 
     value = new BigDecimal("0");
-    stringValue = dateAxisTickCalculator.formatNumber(value);
+    stringValue = numberAxisTickCalculator.formatNumber(value);
     assertThat(stringValue, equalTo("0"));
 
     // other case
@@ -115,21 +115,21 @@ public class ValueFormatterTest {
     styleManager.setLocale(Locale.GERMANY);
 
     value = new BigDecimal("0.01");
-    stringValue = dateAxisTickCalculator.formatNumber(value);
+    stringValue = numberAxisTickCalculator.formatNumber(value);
     assertThat(stringValue, equalTo("0,01"));
 
     value = new BigDecimal("200.23");
-    stringValue = dateAxisTickCalculator.formatNumber(value);
+    stringValue = numberAxisTickCalculator.formatNumber(value);
     assertThat(stringValue, equalTo("200,23"));
 
     styleManager.setNormalDecimalPattern("#.#");
     value = new BigDecimal("200.23");
-    stringValue = dateAxisTickCalculator.formatNumber(value);
+    stringValue = numberAxisTickCalculator.formatNumber(value);
     assertThat(stringValue, equalTo("200,2"));
 
     styleManager.setScientificDecimalPattern("0.#E0");
     value = new BigDecimal("2009764.23");
-    stringValue = dateAxisTickCalculator.formatNumber(value);
+    stringValue = numberAxisTickCalculator.formatNumber(value);
     assertThat(stringValue, equalTo("2E6"));
 
   }
-- 
GitLab