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 ca680566b3a611dd1353d913dbe03a89c306f7ba..507c89ab0de33f45ecb2688f46b34ace4027e5e5 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 @@ -27,6 +27,7 @@ import java.util.List; import com.xeiam.xchart.StyleManager; import com.xeiam.xchart.StyleManager.ChartType; +import com.xeiam.xchart.internal.Utils; import com.xeiam.xchart.internal.chartpart.Axis.Direction; /** @@ -78,6 +79,12 @@ public abstract class AxisTickCalculator { overrideMaxValue = BigDecimal.ZERO; } } + + if (styleManager.getChartType() == ChartType.Bar && styleManager.isYAxisLogarithmic()) { + int logMin = (int) Math.floor(Math.log10(minValue.doubleValue())); + overrideMinValue = new BigDecimal(Utils.pow(10, logMin).doubleValue()); + } + // override min and maxValue if specified if (axisDirection == Direction.X && styleManager.getXAxisMin() != null) { overrideMinValue = new BigDecimal(styleManager.getXAxisMin()); @@ -91,23 +98,14 @@ public abstract class AxisTickCalculator { if (axisDirection == Direction.Y && styleManager.getYAxisMax() != null) { overrideMaxValue = new BigDecimal(styleManager.getYAxisMax()); } - this.axisDirection = axisDirection; this.workingSpace = workingSpace; this.minValue = overrideMinValue; + // this.minValue = new BigDecimal(10000); this.maxValue = overrideMaxValue; this.styleManager = styleManager; } - BigDecimal pow(double base, int exponent) { - - if (exponent > 0) { - return new BigDecimal(base).pow(exponent); - } else { - return BigDecimal.ONE.divide(new BigDecimal(base).pow(-exponent)); - } - } - BigDecimal getFirstPosition(BigDecimal gridStep) { BigDecimal firstPosition; 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 72da082ea12d5244b04d99057948315a7c52882b..2c98d156afb51dc5a5efbbd37212e431403fb278 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 @@ -24,6 +24,7 @@ package com.xeiam.xchart.internal.chartpart; import java.math.BigDecimal; import com.xeiam.xchart.StyleManager; +import com.xeiam.xchart.internal.Utils; import com.xeiam.xchart.internal.chartpart.Axis.Direction; /** @@ -90,8 +91,8 @@ public class AxisTickLogarithmicCalculator extends AxisTickCalculator { // BigDecimal firstPosition = getFirstPosition(tickStep); // System.out.println("firstPosition: " + firstPosition); - BigDecimal firstPosition = pow(10, logMin); - BigDecimal tickStep = pow(10, logMin - 1); + BigDecimal firstPosition = Utils.pow(10, logMin); + BigDecimal tickStep = Utils.pow(10, logMin - 1); for (int i = logMin; i <= logMax; i++) { // for each decade @@ -100,7 +101,7 @@ public class AxisTickLogarithmicCalculator extends AxisTickCalculator { // System.out.println("i: " + i); // System.out.println("pow(10, i).doubleValue(): " + pow(10, i).doubleValue()); - for (BigDecimal j = firstPosition; j.doubleValue() <= pow(10, i).doubleValue(); j = j.add(tickStep)) { + for (BigDecimal j = firstPosition; j.doubleValue() <= Utils.pow(10, i).doubleValue(); j = j.add(tickStep)) { // System.out.println("j: " + j); // System.out.println(Math.log10(j.doubleValue()) % 1); @@ -127,8 +128,8 @@ public class AxisTickLogarithmicCalculator extends AxisTickCalculator { * tickSpace); tickLocations.add(tickLabelPosition); } - tickStep = tickStep.multiply(pow(10, 1)); - firstPosition = tickStep.add(pow(10, i)); + tickStep = tickStep.multiply(Utils.pow(10, 1)); + firstPosition = tickStep.add(Utils.pow(10, i)); } } } 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 50c7441908d07cdbf68ab705bbe06bcd4d709bc8..eb262c8395abdb6cbfd774b5d544adbcf8b895ec 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 @@ -24,6 +24,7 @@ package com.xeiam.xchart.internal.chartpart; import java.math.BigDecimal; import com.xeiam.xchart.StyleManager; +import com.xeiam.xchart.internal.Utils; import com.xeiam.xchart.internal.chartpart.Axis.Direction; /** @@ -121,16 +122,16 @@ public class AxisTickNumericalCalculator extends AxisTickCalculator { BigDecimal gridStep; if (significand > 7.5) { // gridStep = 10.0 * 10 ** exponent - gridStep = BigDecimal.TEN.multiply(pow(10, exponent)); + gridStep = BigDecimal.TEN.multiply(Utils.pow(10, exponent)); } else if (significand > 3.5) { // gridStep = 5.0 * 10 ** exponent - gridStep = new BigDecimal(new Double(5).toString()).multiply(pow(10, exponent)); + gridStep = new BigDecimal(new Double(5).toString()).multiply(Utils.pow(10, exponent)); } else if (significand > 1.5) { // gridStep = 2.0 * 10 ** exponent - gridStep = new BigDecimal(new Double(2).toString()).multiply(pow(10, exponent)); + gridStep = new BigDecimal(new Double(2).toString()).multiply(Utils.pow(10, exponent)); } else { // gridStep = 1.0 * 10 ** exponent - gridStep = pow(10, exponent); + gridStep = Utils.pow(10, exponent); } return gridStep; } 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 713b3963baa345173a475de5ca9a521cac85f2f5..d586b9868ebe3528fa3b1515b11dd99d29400926 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 @@ -93,11 +93,20 @@ public class PlotContentBarChart extends PlotContent { // override min and maxValue if specified if (getChartPainter().getStyleManager().getYAxisMin() != null) { yMin = new BigDecimal(getChartPainter().getStyleManager().getYAxisMin()); + } else if (getChartPainter().getStyleManager().isYAxisLogarithmic()) { + // int logMin = (int) Math.floor(Math.log10(getChartPainter().getAxisPair().getyAxis().getMin().doubleValue())); + int logMin = (int) Math.floor(Math.log10(getChartPainter().getAxisPair().getyAxis().getMin().doubleValue())); + // System.out.println("logMin: " + logMin); + // System.out.println("min : " + getChartPainter().getAxisPair().getyAxis().getMin().doubleValue()); + // yMin = new BigDecimal(Math.log10(Utils.pow(10, logMin).doubleValue())); + // yMin = new BigDecimal(Utils.pow(10, logMin).doubleValue()); + yMin = new BigDecimal(logMin); } if (getChartPainter().getStyleManager().getYAxisMax() != null) { yMax = new BigDecimal(getChartPainter().getStyleManager().getYAxisMax()); + } else if (getChartPainter().getStyleManager().isYAxisLogarithmic()) { + yMax = new BigDecimal(Math.log10(yMax.doubleValue())); } - // figure out the general form of the chart int chartForm = 1; // 1=positive, -1=negative, 0=span if (yMin.compareTo(BigDecimal.ZERO) > 0 && yMax.compareTo(BigDecimal.ZERO) > 0) { @@ -107,6 +116,8 @@ public class PlotContentBarChart extends PlotContent { } else { chartForm = 0;// span chart } + // System.out.println(yMin); + // System.out.println(yMax); Iterator<?> categoryItr = categories.iterator(); Iterator<Number> yItr = yData.iterator(); @@ -117,6 +128,11 @@ public class PlotContentBarChart extends PlotContent { if (xData.contains(categoryItr.next())) { BigDecimal y = new BigDecimal(yItr.next().doubleValue()); + if (getChartPainter().getStyleManager().isYAxisLogarithmic()) { + y = new BigDecimal(Math.log10(y.doubleValue())); + } else { + y = new BigDecimal(y.doubleValue()); + } BigDecimal yTop = null; BigDecimal yBottom = null; @@ -142,15 +158,10 @@ public class PlotContentBarChart extends PlotContent { break; } - // if (yTop.compareTo(yMax) > 0) { - // yTop = yMax; - // } int yTransform = (int) (bounds.getHeight() - (yTopMargin + yTop.subtract(yMin).doubleValue() / yMax.subtract(yMin).doubleValue() * yTickSpace)); + int yOffset = (int) (bounds.getY() + yTransform) + 1; - // if (yBottom.compareTo(yMin) > 0) { - // yBottom = yMin; - // } int zeroTransform = (int) (bounds.getHeight() - (yTopMargin + (yBottom.subtract(yMin).doubleValue()) / (yMax.subtract(yMin).doubleValue()) * yTickSpace)); int zeroOffset = (int) (bounds.getY() + zeroTransform) + 1;