From 83966b26254ed1ee58b21358c5b1373ec23717e6 Mon Sep 17 00:00:00 2001
From: Tim Molter <tim.molter@gmail.com>
Date: Fri, 25 Apr 2014 22:43:51 +0200
Subject: [PATCH] added ticker marks below and above min and max values if with
 a certain tolerance.

---
 .../xeiam/xchart/demo/charts/date/DateChart03.java  |  8 ++++----
 .../xchart/demo/charts/scatter/ScatterChart02.java  |  2 +-
 .../src/main/java/com/xeiam/xchart/Histogram.java   |  4 ++--
 .../internal/chartpart/AxisTickCalculator.java      | 13 ++++++++-----
 .../internal/chartpart/AxisTickDateCalculator.java  |  6 +++---
 .../chartpart/AxisTickLogarithmicCalculator.java    |  6 +++---
 .../chartpart/AxisTickNumericalCalculator.java      |  2 +-
 7 files changed, 22 insertions(+), 19 deletions(-)

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 5d9786ae..74351cfa 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
@@ -53,16 +53,16 @@ public class DateChart03 implements ExampleChart {
 
     Random random = new Random();
 
-    DateFormat sdf = new SimpleDateFormat("HH:mm:ss.SSS");
+    DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd-HH:mm:ss.SSS");
     Date date = null;
     for (int i = 1; i <= 14; i++) {
       try {
-        date = sdf.parse("08:" + (5 * i + random.nextInt(2)) + ":" + (random.nextInt(2)) + "." + random.nextInt(1000));
+        date = sdf.parse("2013-07-22-08:" + (5 * i + random.nextInt(2)) + ":" + (random.nextInt(2)) + "." + random.nextInt(1000));
       } catch (ParseException e) {
         e.printStackTrace();
       }
-      // System.out.println(date.getTime());
-      // System.out.println(date.toString());
+      System.out.println(date.getTime());
+      System.out.println(date.toString());
       xData.add(date);
       yData.add(Math.random() * i);
     }
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
index cc795957..777065cf 100644
--- 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
@@ -55,7 +55,7 @@ public class ScatterChart02 implements ExampleChart {
     for (int i = 0; i < size; i++) {
       double nextRandom = random.nextDouble();
       xData.add(Math.pow(10, nextRandom * 10));
-      yData.add(nextRandom + random.nextDouble());
+      yData.add(1000000000.0 + nextRandom + random.nextDouble());
     }
 
     // Create Chart
diff --git a/xchart/src/main/java/com/xeiam/xchart/Histogram.java b/xchart/src/main/java/com/xeiam/xchart/Histogram.java
index d7bd8306..31cb3b98 100644
--- a/xchart/src/main/java/com/xeiam/xchart/Histogram.java
+++ b/xchart/src/main/java/com/xeiam/xchart/Histogram.java
@@ -87,10 +87,10 @@ public class Histogram {
 
       int bin = (int) ((((Number) itr.next()).doubleValue() - min) / binSize); // changed this from numBins
       if (bin < 0) { /* this data is smaller than min */
-        System.out.println("less than");
+        // System.out.println("less than");
       }
       else if (bin > numBins) { /* this data point is bigger than max */
-        System.out.println("greater than");
+        // System.out.println("greater than");
       }
       else if (bin == numBins) { // this falls right on the edge of the max bin
         tempYAxisData[bin - 1] += 1;
diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTickCalculator.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTickCalculator.java
index 7141e461..63bd1646 100644
--- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTickCalculator.java
+++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTickCalculator.java
@@ -100,13 +100,16 @@ public abstract class AxisTickCalculator {
    */
   double getFirstPosition(double gridStep) {
 
-    double firstPosition;
-    if (minValue % gridStep <= 0.0) {
+    // System.out.println("******");
+
+    double firstPosition = minValue - (minValue % gridStep) + gridStep;
+
+    // System.out.println(firstPosition - minValue);
+    // System.out.println(.9 * gridStep);
+
+    if ((firstPosition - minValue) > .8 * gridStep) {
       firstPosition = minValue - (minValue % gridStep);
     }
-    else {
-      firstPosition = minValue - (minValue % gridStep) + gridStep;
-    }
     return firstPosition;
   }
 
diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTickDateCalculator.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTickDateCalculator.java
index 4046f870..4e2a3f22 100644
--- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTickDateCalculator.java
+++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTickDateCalculator.java
@@ -47,7 +47,7 @@ public class AxisTickDateCalculator extends AxisTickCalculator {
   private void calculate() {
 
     // tick space - a percentage of the working space available for ticks
-    int tickSpace = (int) (styleManager.getAxisTickSpaceRatio() * workingSpace); // in plot space
+    double tickSpace = styleManager.getAxisTickSpaceRatio() * workingSpace; // in plot space
 
     // where the tick should begin in the working space in pixels
     double margin = Utils.getTickStartOffset(workingSpace, tickSpace); // in plot space double gridStep = getGridStepForDecimal(tickSpace);
@@ -55,7 +55,7 @@ public class AxisTickDateCalculator extends AxisTickCalculator {
     // the span of the data
     long span = (long) Math.abs(maxValue - minValue); // in data space
 
-    long gridStepHint = (long) (span / (double) tickSpace * styleManager.getXAxisTickMarkSpacingHint());
+    long gridStepHint = (long) (span / tickSpace * styleManager.getXAxisTickMarkSpacingHint());
 
     long timeUnit = dateFormatter.getTimeUnit(gridStepHint);
     double gridStep = 0.0;
@@ -74,7 +74,7 @@ public class AxisTickDateCalculator extends AxisTickCalculator {
 
       tickLabels.add(dateFormatter.formatDate(tickPosition, timeUnit));
       // here we convert tickPosition finally to plot space, i.e. pixels
-      double tickLabelPosition = (int) (margin + ((tickPosition - minValue) / (maxValue - minValue) * tickSpace));
+      double tickLabelPosition = margin + ((tickPosition - minValue) / (maxValue - minValue) * tickSpace);
       tickLocations.add(tickLabelPosition);
     }
   }
diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTickLogarithmicCalculator.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTickLogarithmicCalculator.java
index 266598a1..5fc5279a 100644
--- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTickLogarithmicCalculator.java
+++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTickLogarithmicCalculator.java
@@ -93,18 +93,18 @@ public class AxisTickLogarithmicCalculator extends AxisTickCalculator {
       // System.out.println("i: " + i);
       // System.out.println("pow(10, i).doubleValue(): " + pow(10, i).doubleValue());
 
-      // using trhe .00000001 factor to dal with double value imprecision
+      // using the .00000001 factor to deal with double value imprecision
       for (double j = firstPosition; j <= Utils.pow(10, i) + .00000001; j = j + tickStep) {
 
         // System.out.println("j: " + j);
         // System.out.println(Math.log10(j) % 1);
 
-        if (j < minValue) {
+        if (j < minValue - tickStep * .2) {
           // System.out.println("continue");
           continue;
         }
 
-        if (j > maxValue) {
+        if (j > maxValue + tickStep * 1.2) {
           // System.out.println("break");
           break;
         }
diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTickNumericalCalculator.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTickNumericalCalculator.java
index c83b47ca..6a5d3f15 100644
--- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTickNumericalCalculator.java
+++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTickNumericalCalculator.java
@@ -65,7 +65,7 @@ public class AxisTickNumericalCalculator extends AxisTickCalculator {
     BigDecimal firstPosition = BigDecimal.valueOf(getFirstPosition(gridStep.doubleValue()));
 
     // generate all tickLabels and tickLocations from the first to last position
-    for (BigDecimal tickPosition = firstPosition; tickPosition.compareTo(BigDecimal.valueOf(maxValue)) <= 0; tickPosition = tickPosition.add(gridStep)) {
+    for (BigDecimal tickPosition = firstPosition; tickPosition.compareTo(BigDecimal.valueOf(maxValue + gridStep.doubleValue() * 0.8)) <= 0; tickPosition = tickPosition.add(gridStep)) {
 
       tickLabels.add(numberFormatter.formatNumber(tickPosition.doubleValue()));
       // here we convert tickPosition finally to plot space, i.e. pixels
-- 
GitLab