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 25b9861ba58988647aaa3ed795698e404afa6bf4..671ac3b2aff9189375ecfc79471148e5345e884c 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 6dff89a8fc7f521d62a50b6f44cf23dcfb52b128..2b6c91b147e5b7326acf69be3ec9d1d361dfa276 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 e24bfc7e0f9e4539b46d53fd4da4d4d04aaaf5f8..75a19a72edf13e10e5c01ce2f24354f31a4d186c 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 1411cfbed3ec8dd6ea230b033adbeb5f188d2ea1..affff94dfcf550755a28bff7d20be334043a7266 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 922997b19c0dcbeb951b3d23a64e47af5b86e114..853131a31ca3c317017a8b17e3c0176191c4cf27 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);