From f9db1696d818075182cf2516c1bc1d17adbd4628 Mon Sep 17 00:00:00 2001
From: Tim Molter <tim.molter@gmail.com>
Date: Wed, 6 Mar 2013 22:34:41 +0100
Subject: [PATCH] fixed major bar chart rendering error

---
 .../com/xeiam/xchart/demo/XChartDemo.java     |  6 +-
 .../xchart/demo/charts/bar/BarChart02.java    | 12 ++--
 .../xchart/demo/charts/bar/BarChart03.java    |  4 +-
 .../xchart/demo/charts/bar/BarChart05.java    |  2 +-
 .../chartpart/PlotContentBarChart.java        | 63 ++++++++++++++++---
 5 files changed, 68 insertions(+), 19 deletions(-)

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 25b9861b..671ac3b2 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
@@ -183,16 +183,16 @@ public class XChartDemo extends JPanel implements TreeSelectionListener {
     chart = new DefaultMutableTreeNode(new ChartInfo("BarChart01 - Basic Bar Chart", new BarChart01().getChart()));
     category.add(chart);
 
-    chart = new DefaultMutableTreeNode(new ChartInfo("BarChart02 - Basic Bar Chart", new BarChart02().getChart()));
+    chart = new DefaultMutableTreeNode(new ChartInfo("BarChart02 - Date Categories", new BarChart02().getChart()));
     category.add(chart);
 
-    chart = new DefaultMutableTreeNode(new ChartInfo("BarChart03 - Basic Bar Chart", new BarChart03().getChart()));
+    chart = new DefaultMutableTreeNode(new ChartInfo("BarChart03 - Positive and Negative", new BarChart03().getChart()));
     category.add(chart);
 
     chart = new DefaultMutableTreeNode(new ChartInfo("BarChart04 - Missing Point in Series", new BarChart04().getChart()));
     category.add(chart);
 
-    chart = new DefaultMutableTreeNode(new ChartInfo("BarChart05 - Basic Bar Chart", new BarChart05().getChart()));
+    chart = new DefaultMutableTreeNode(new ChartInfo("BarChart05 - GGPlot2 Theme", new BarChart05().getChart()));
     category.add(chart);
 
     // Theme category
diff --git a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/bar/BarChart02.java b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/bar/BarChart02.java
index 6dff89a8..2b6c91b1 100644
--- a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/bar/BarChart02.java
+++ b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/bar/BarChart02.java
@@ -31,12 +31,14 @@ import java.util.Random;
 
 import com.xeiam.xchart.Chart;
 import com.xeiam.xchart.ChartBuilder;
-import com.xeiam.xchart.SwingWrapper;
+import com.xeiam.xchart.Series;
+import com.xeiam.xchart.SeriesColor;
 import com.xeiam.xchart.StyleManager.ChartType;
+import com.xeiam.xchart.SwingWrapper;
 import com.xeiam.xchart.demo.charts.ExampleChart;
 
 /**
- * Basic Bar Chart
+ * Date Categories
  * <p>
  * Demonstrates the following:
  * <ul>
@@ -44,6 +46,7 @@ import com.xeiam.xchart.demo.charts.ExampleChart;
  * <li>All negative values
  * <li>Single series
  * <li>No horizontal plot gridlines
+ * <li>Change series color
  */
 public class BarChart02 implements ExampleChart {
 
@@ -73,9 +76,10 @@ public class BarChart02 implements ExampleChart {
         e.printStackTrace();
       }
       xData.add(date);
-      yData.add(random.nextInt(i) + 1);
+      yData.add(-1 * ((random.nextInt(i) + 1)));
     }
-    chart.addDateSeries("Model 77", xData, yData);
+    Series series = chart.addDateSeries("Model 77", xData, yData);
+    series.setLineColor(SeriesColor.RED);
     chart.getStyleManager().setPlotGridLinesVisible(false);
 
     return chart;
diff --git a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/bar/BarChart03.java b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/bar/BarChart03.java
index e24bfc7e..75a19a72 100644
--- a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/bar/BarChart03.java
+++ b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/bar/BarChart03.java
@@ -23,12 +23,12 @@ 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.StyleManager.ChartType;
+import com.xeiam.xchart.SwingWrapper;
 import com.xeiam.xchart.demo.charts.ExampleChart;
 
 /**
- * Basic Bar Chart
+ * Positive and Negative
  * <p>
  * Demonstrates the following:
  * <ul>
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 1411cfbe..affff94d 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
@@ -32,7 +32,7 @@ import com.xeiam.xchart.SwingWrapper;
 import com.xeiam.xchart.demo.charts.ExampleChart;
 
 /**
- * Multiple series Bar Chart
+ * GGPlot2 Theme
  * <p>
  * Demonstrates the following:
  * <ul>
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 922997b1..853131a3 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
@@ -80,11 +80,16 @@ public class PlotContentBarChart extends PlotContent {
       Collection<Number> yData = series.getyData();
       BigDecimal yMin = getChartPainter().getAxisPair().getyAxis().getMin();
       BigDecimal yMax = getChartPainter().getAxisPair().getyAxis().getMax();
+
+      // if min and max positive, set min to zero
       if (yMin.compareTo(BigDecimal.ZERO) > 0 && yMax.compareTo(BigDecimal.ZERO) > 0) {
         yMin = BigDecimal.ZERO;
-      } else if (yMin.compareTo(BigDecimal.ZERO) < 0 && yMax.compareTo(BigDecimal.ZERO) < 0) {
+      }
+      // if min and max negative, set max to zero
+      if (yMin.compareTo(BigDecimal.ZERO) < 0 && yMax.compareTo(BigDecimal.ZERO) < 0) {
         yMax = BigDecimal.ZERO;
       }
+
       // override min and maxValue if specified
       if (getChartPainter().getStyleManager().getYAxisMin() != null) {
         yMin = new BigDecimal(getChartPainter().getStyleManager().getYAxisMin());
@@ -92,6 +97,23 @@ public class PlotContentBarChart extends PlotContent {
       if (getChartPainter().getStyleManager().getYAxisMax() != null) {
         yMax = new BigDecimal(getChartPainter().getStyleManager().getYAxisMax());
       }
+
+      // 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) {
+        // positive chart
+        chartForm = 1;
+        System.out.println("positive chart");
+      } else if (yMin.compareTo(BigDecimal.ZERO) < 0 && yMax.compareTo(BigDecimal.ZERO) < 0) {
+        // negative chart
+        chartForm = -1;
+        System.out.println("negative chart");
+      } else {
+        // span chart
+        chartForm = 0;
+        System.out.println("span chart");
+      }
+
       Iterator<?> categoryItr = categories.iterator();
       Iterator<Number> yItr = yData.iterator();
 
@@ -101,19 +123,42 @@ public class PlotContentBarChart extends PlotContent {
         if (xData.contains(categoryItr.next())) {
 
           BigDecimal y = new BigDecimal(yItr.next().doubleValue());
-          BigDecimal yTop = new BigDecimal(y.doubleValue());
-          if (yTop.compareTo(yMax) > 0) {
+          BigDecimal yTop = null;
+          BigDecimal yBottom = null;
+
+          switch (chartForm) {
+          case 1: // positive chart
+            yTop = new BigDecimal(y.doubleValue());
+            yBottom = yMin;
+            break;
+          case -1: // negative chart
             yTop = yMax;
+            yBottom = new BigDecimal(y.doubleValue());
+            break;
+          case 0: // span chart
+            if (y.compareTo(BigDecimal.ZERO) >= 0) { // positive
+              yTop = y;
+              yBottom = BigDecimal.ZERO;
+            } else {
+              yTop = BigDecimal.ZERO;
+              yBottom = y;
+            }
+            break;
+          default:
+            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);
+          int yOffset = (int) (bounds.getY() + yTransform) + 1;
 
-          BigDecimal yBottom = new BigDecimal(y.doubleValue());
-          if (yBottom.compareTo(yMin) > 0) {
-            yBottom = yMin;
-          }
+          // 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);
+          int zeroOffset = (int) (bounds.getY() + zeroTransform) + 1;
 
           // paint bar
           int barWidth = (int) (gridStep / seriesMap.size() / 1.1);
-- 
GitLab