diff --git a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/bar/BarChart06.java b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/bar/BarChart06.java index acd8fc00f9212b34f2ab610b28061029dd0ff169..f885bdd38f874ceb1fc44016938c390213420e72 100644 --- a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/bar/BarChart06.java +++ b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/bar/BarChart06.java @@ -48,11 +48,12 @@ public class BarChart06 implements ExampleChart { // Create Chart Chart chart = new ChartBuilder().chartType(ChartType.Bar).width(800).height(600).title("Score Histogram").xAxisTitle("Score").yAxisTitle("Count").build(); - chart.addSeries("histogram 1", getGaussianData(1000), 11, -30, 30); - chart.addSeries("histogram 2", getGaussianData(1000), 11, -30, 30); + chart.addSeries("histogram 1", getGaussianData(10000), 10, -30, 30); + chart.addSeries("histogram 2", getGaussianData(10000), 10, -30, 30); // Customize Chart chart.getStyleManager().setLegendPosition(LegendPosition.InsideNW); + chart.getStyleManager().setBarWidthPercentage(.99); return chart; } @@ -62,8 +63,8 @@ public class BarChart06 implements ExampleChart { List<Double> data = new ArrayList<Double>(count); Random r = new Random(); for (int i = 0; i < count; i++) { - // data.add(r.nextGaussian() * 10); - data.add(r.nextDouble() * 60 - 30); + data.add(r.nextGaussian() * 10); + // data.add(r.nextDouble() * 60 - 30); } return data; } diff --git a/xchart/src/main/java/com/xeiam/xchart/StyleManager.java b/xchart/src/main/java/com/xeiam/xchart/StyleManager.java index 3b396e4c4efb09ac098c0cc0b9f60533ce52b944..32acadf243890607e6b11285de7083c93a69c2a4 100644 --- a/xchart/src/main/java/com/xeiam/xchart/StyleManager.java +++ b/xchart/src/main/java/com/xeiam/xchart/StyleManager.java @@ -38,7 +38,7 @@ public class StyleManager { */ public enum ChartType { - Line, Scatter, Area, Bar, Histogram + Line, Scatter, Area, Bar } public enum LegendPosition { @@ -126,6 +126,7 @@ public class StyleManager { private boolean isPlotTicksMarksVisible; private Color plotGridLinesColor; private Stroke plotGridLinesStroke; + private double barWidthPercentage; // Error Bars /////////////////////////////// private Color errorBarsColor; @@ -204,6 +205,7 @@ public class StyleManager { isPlotTicksMarksVisible = theme.isPlotTicksMarksVisible(); plotGridLinesColor = theme.getPlotGridLinesColor(); plotGridLinesStroke = theme.getPlotGridLinesStroke(); + barWidthPercentage = theme.getBarWidthPercentage(); // Error Bars /////////////////////////////// errorBarsColor = theme.getErrorBarsColor(); @@ -966,6 +968,23 @@ public class StyleManager { return plotGridLinesStroke; } + // Bar Charts /////////////////////////////// + + /** + * set the width of a single bar in a bar chart. full width is 100%, i.e. 1.0 + * + * @param barWidthPercentage + */ + public void setBarWidthPercentage(double barWidthPercentage) { + + this.barWidthPercentage = barWidthPercentage; + } + + public double getBarWidthPercentage() { + + return barWidthPercentage; + } + // Error Bars /////////////////////////////// /** diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTickBarChartCalculator.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTickBarChartCalculator.java index 4cac349127aea855ff64793041d25654807c0d70..565e2e27f2c905c3cc5717f380961149c5387a75 100644 --- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTickBarChartCalculator.java +++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/AxisTickBarChartCalculator.java @@ -99,7 +99,7 @@ public class AxisTickBarChartCalculator extends AxisTickCalculator { tickLocations.add(tickLabelPosition); } } - else if (categories.size() < 13) { // Number or Date and 12 or less categories + else if (categories.size() < 13) { // Number or Date and 12 or less categories. give each category a tick label double gridStep = (tickSpace / (double) categories.size()); double firstPosition = gridStep / 2.0; @@ -130,7 +130,7 @@ public class AxisTickBarChartCalculator extends AxisTickCalculator { tickLocations.add(tickLabelPosition); } } - else { // Number or Date + else { // Number or Date and more than 12 categories. divide up the axis tick space according to normal number axis layout double gridStep = getNumericalGridStep(tickSpace); double firstPosition = getFirstPosition(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 17e6ca015010bd5a2b4fa5936e2c017902f84404..262ffd1ef6bf7beca42025af2d849ad81721999e 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 @@ -167,8 +167,9 @@ public class PlotContentBarChart extends PlotContent { double zeroOffset = bounds.getY() + zeroTransform; // paint bar - double barWidth = gridStep / getChartPainter().getAxisPair().getSeriesMap().size() / 1.1; - double barMargin = gridStep * .05; + double barWidthPercentage = getChartPainter().getStyleManager().getBarWidthPercentage(); + double barWidth = gridStep / getChartPainter().getAxisPair().getSeriesMap().size() * barWidthPercentage; + double barMargin = gridStep * (1 - barWidthPercentage) / 2; double xOffset = bounds.getX() + xLeftMargin + gridStep * barCounter++ + seriesCounter * barWidth + barMargin; g.setColor(series.getStrokeColor()); diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/PlotContentLineChart.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/PlotContentLineChart.java index f5db6e6c92b85d7a1d12c6ea94f13af305ee3394..91240092b769fea91e5900c929b2f9d1f814adc4 100644 --- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/PlotContentLineChart.java +++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/PlotContentLineChart.java @@ -185,7 +185,7 @@ public class PlotContentLineChart extends PlotContent { if (previousX != Integer.MIN_VALUE && previousY != Integer.MIN_VALUE) { g.setColor(series.getStrokeColor()); - double yBottomOfArea = bounds.getY() + bounds.getHeight() - yTopMargin + 1; + double yBottomOfArea = bounds.getY() + bounds.getHeight() - yTopMargin; if (path == null) { path = new Path2D.Double(); @@ -264,7 +264,7 @@ public class PlotContentLineChart extends PlotContent { private void closePath(Graphics2D g, Path2D.Double path, double previousX, Rectangle2D bounds, double yTopMargin) { if (path != null) { - double yBottomOfArea = bounds.getY() + bounds.getHeight() - yTopMargin + 1; + double yBottomOfArea = bounds.getY() + bounds.getHeight() - yTopMargin; path.lineTo(previousX, yBottomOfArea); path.closePath(); g.fill(path); diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/style/GGPlot2Theme.java b/xchart/src/main/java/com/xeiam/xchart/internal/style/GGPlot2Theme.java index 1d5ffdc4bc637d5a767137079513c531b99ce00e..41fe250b1e20ed1430430e1e268511060961f2e9 100644 --- a/xchart/src/main/java/com/xeiam/xchart/internal/style/GGPlot2Theme.java +++ b/xchart/src/main/java/com/xeiam/xchart/internal/style/GGPlot2Theme.java @@ -279,6 +279,14 @@ public class GGPlot2Theme implements Theme { return new BasicStroke(1.5f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL); } + // Bar Charts /////////////////////////////// + + @Override + public double getBarWidthPercentage() { + + return 0.9; + } + // Error Bars /////////////////////////////// @Override diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/style/MatlabTheme.java b/xchart/src/main/java/com/xeiam/xchart/internal/style/MatlabTheme.java index 717ea8130a2d1114ffb795363c1ab7d461f3a08a..43cf3b2172629bf32dd356be1f83a137f534705b 100644 --- a/xchart/src/main/java/com/xeiam/xchart/internal/style/MatlabTheme.java +++ b/xchart/src/main/java/com/xeiam/xchart/internal/style/MatlabTheme.java @@ -280,6 +280,14 @@ public class MatlabTheme implements Theme { } + // Bar Charts /////////////////////////////// + + @Override + public double getBarWidthPercentage() { + + return 0.9; + } + // Error Bars /////////////////////////////// @Override diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/style/Theme.java b/xchart/src/main/java/com/xeiam/xchart/internal/style/Theme.java index fe412c7330652984cebbee89d097a7b8ec064a15..629073fe62112d88605cb6c6ad421304c014d15f 100644 --- a/xchart/src/main/java/com/xeiam/xchart/internal/style/Theme.java +++ b/xchart/src/main/java/com/xeiam/xchart/internal/style/Theme.java @@ -116,6 +116,10 @@ public interface Theme { public boolean isPlotTicksMarksVisible(); + // Bar Charts /////////////////////////////// + + public double getBarWidthPercentage(); + // Error Bars /////////////////////////////// public Color getErrorBarsColor(); diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/style/XChartTheme.java b/xchart/src/main/java/com/xeiam/xchart/internal/style/XChartTheme.java index bfb470f18af9a56483b0f614ab7ab1448ce0f37e..39fb848b98910a8946789abc1d51c483ff129834 100644 --- a/xchart/src/main/java/com/xeiam/xchart/internal/style/XChartTheme.java +++ b/xchart/src/main/java/com/xeiam/xchart/internal/style/XChartTheme.java @@ -279,6 +279,14 @@ public class XChartTheme implements Theme { return new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 10.0f, new float[] { 3.0f, 3.0f }, 0.0f); } + // Bar Charts /////////////////////////////// + + @Override + public double getBarWidthPercentage() { + + return 0.9; + } + // Error Bars /////////////////////////////// @Override