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 5930b3904d2ccc538afa96d7ab07cc128afc26b9..7232b4b8a264993283957745b64c8d1fc89f4761 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 @@ -38,6 +38,8 @@ import com.xeiam.xchart.demo.charts.bar.BarChart02; import com.xeiam.xchart.demo.charts.bar.BarChart03; import com.xeiam.xchart.demo.charts.bar.BarChart04; import com.xeiam.xchart.demo.charts.bar.BarChart05; +import com.xeiam.xchart.demo.charts.bar.BarChart06; +import com.xeiam.xchart.demo.charts.bar.BarChart07; import com.xeiam.xchart.demo.charts.date.DateChart01; import com.xeiam.xchart.demo.charts.date.DateChart02; import com.xeiam.xchart.demo.charts.date.DateChart03; @@ -192,7 +194,7 @@ public class XChartDemo extends JPanel implements TreeSelectionListener { defaultMutableTreeNode = new DefaultMutableTreeNode(new ChartInfo("AreaChart02 - Null Y-Axis Data Points", new AreaChart02().getChart())); category.add(defaultMutableTreeNode); - // First category + // Line category category = new DefaultMutableTreeNode("Line Charts"); top.add(category); @@ -249,6 +251,12 @@ public class XChartDemo extends JPanel implements TreeSelectionListener { defaultMutableTreeNode = new DefaultMutableTreeNode(new ChartInfo("BarChart05 - GGPlot2 Theme", new BarChart05().getChart())); category.add(defaultMutableTreeNode); + defaultMutableTreeNode = new DefaultMutableTreeNode(new ChartInfo("BarChart06 - Histogram Overlapped", new BarChart06().getChart())); + category.add(defaultMutableTreeNode); + + defaultMutableTreeNode = new DefaultMutableTreeNode(new ChartInfo("BarChart07 - Histogram Not Overlapped", new BarChart07().getChart())); + category.add(defaultMutableTreeNode); + // Theme category category = new DefaultMutableTreeNode("Chart Themes"); top.add(category); 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 15b4ccbebcc5ee5a679cc3186261cc9754708a3e..2f174ff2ddc660f720e9b789b9f7cfc50a34b444 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 @@ -21,17 +21,19 @@ import java.util.Random; import com.xeiam.xchart.Chart; import com.xeiam.xchart.ChartBuilder; +import com.xeiam.xchart.Histogram; import com.xeiam.xchart.StyleManager.ChartType; import com.xeiam.xchart.StyleManager.LegendPosition; import com.xeiam.xchart.SwingWrapper; import com.xeiam.xchart.demo.charts.ExampleChart; /** - * Basic Bar Chart + * Histogram Overlapped * <p> * Demonstrates the following: * <ul> * <li>Histogram + * <li>Bar Chart styles - overlapped, bar width */ public class BarChart06 implements ExampleChart { @@ -46,15 +48,18 @@ public class BarChart06 implements ExampleChart { public Chart getChart() { // Create Chart - Chart chart = new ChartBuilder().chartType(ChartType.Bar).width(800).height(600).title("Score Histogram").xAxisTitle("Score").yAxisTitle("Count").build(); + Chart chart = new ChartBuilder().chartType(ChartType.Bar).width(800).height(600).title("Score Histogram").xAxisTitle("Mean").yAxisTitle("Count").build(); - chart.addSeries("histogram 1", getGaussianData(10000), 30, -30, 30); - chart.addSeries("histogram 2", getGaussianData(5000), 30, -30, 30); + Histogram histogram1 = new Histogram(getGaussianData(10000), 30, -30, 30); + Histogram histogram2 = new Histogram(getGaussianData(5000), 30, -30, 30); + chart.addSeries("histogram 1", histogram1.getxAxisData(), histogram1.getyAxisData()); + chart.addSeries("histogram 2", histogram2.getxAxisData(), histogram2.getyAxisData()); // Customize Chart chart.getStyleManager().setLegendPosition(LegendPosition.InsideNW); chart.getStyleManager().setBarWidthPercentage(.96); - chart.getStyleManager().setOverlapped(false); + chart.getStyleManager().setOverlapped(true); + return chart; } diff --git a/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/bar/BarChart07.java b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/bar/BarChart07.java new file mode 100644 index 0000000000000000000000000000000000000000..3b156ee55912e8c80fc19dc5e52f90b6933b75d9 --- /dev/null +++ b/xchart-demo/src/main/java/com/xeiam/xchart/demo/charts/bar/BarChart07.java @@ -0,0 +1,77 @@ +/** + * Copyright 2011 - 2014 Xeiam LLC. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.xeiam.xchart.demo.charts.bar; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +import com.xeiam.xchart.Chart; +import com.xeiam.xchart.ChartBuilder; +import com.xeiam.xchart.Histogram; +import com.xeiam.xchart.StyleManager.ChartType; +import com.xeiam.xchart.StyleManager.LegendPosition; +import com.xeiam.xchart.SwingWrapper; +import com.xeiam.xchart.demo.charts.ExampleChart; + +/** + * Histogram Not Overlapped + * <p> + * Demonstrates the following: + * <ul> + * <li>Histogram + * <li>Bar Chart styles - not overlapped, bar width + * <li>Integer data values + */ +public class BarChart07 implements ExampleChart { + + public static void main(String[] args) { + + ExampleChart exampleChart = new BarChart07(); + Chart chart = exampleChart.getChart(); + new SwingWrapper(chart).displayChart(); + } + + @Override + public Chart getChart() { + + // Create Chart + Chart chart = new ChartBuilder().chartType(ChartType.Bar).width(800).height(600).title("Score Histogram").xAxisTitle("Mean").yAxisTitle("Count").build(); + + Histogram histogram1 = new Histogram(getGaussianData(1000), 10, -30, 30); + chart.addSeries("histogram 1", histogram1.getxAxisData(), histogram1.getyAxisData()); + Histogram histogram2 = new Histogram(getGaussianData(1000), 10, -30, 30); + chart.addSeries("histogram 2", histogram2.getxAxisData(), histogram2.getyAxisData()); + + // Customize Chart + chart.getStyleManager().setLegendPosition(LegendPosition.InsideNW); + chart.getStyleManager().setBarWidthPercentage(.96); + + return chart; + } + + private List<Integer> getGaussianData(int count) { + + List<Integer> data = new ArrayList<Integer>(count); + Random r = new Random(); + for (int i = 0; i < count; i++) { + data.add((int) (r.nextGaussian() * 10)); + // data.add(r.nextDouble() * 60 - 30); + } + return data; + } + +} diff --git a/xchart/src/main/java/com/xeiam/xchart/Chart.java b/xchart/src/main/java/com/xeiam/xchart/Chart.java index 8825732f22bbc745aa67ae9c5b437dcb370b5549..b0f924d03e7ff726b4696016027f7fb258d3bab0 100644 --- a/xchart/src/main/java/com/xeiam/xchart/Chart.java +++ b/xchart/src/main/java/com/xeiam/xchart/Chart.java @@ -22,7 +22,6 @@ import java.util.List; import java.util.Map; import com.xeiam.xchart.StyleManager.ChartTheme; -import com.xeiam.xchart.internal.Histogram; import com.xeiam.xchart.internal.chartpart.ChartPainter; import com.xeiam.xchart.internal.style.Theme; @@ -222,22 +221,22 @@ public class Chart { return chartPainter.getAxisPair().addSeries(seriesName, xDataNumber, yDataNumber, errorBarDataNumber); } - /** - * Add a series for a histogram - * - * @param seriesName - * @param data - * @param numBins - * @param min - * @param max - * @return - */ - public Series addSeries(String seriesName, Collection<? extends Number> data, int numBins, double min, double max) { - - Histogram histogram1 = new Histogram(data, numBins, min, max); - - return chartPainter.getAxisPair().addSeries(seriesName, histogram1.getxAxisData(), histogram1.getyAxisData(), null); - } + // /** + // * Add a series for a histogram + // * + // * @param seriesName + // * @param data + // * @param numBins + // * @param min + // * @param max + // * @return + // */ + // public Series addSeries(String seriesName, Collection<? extends Number> data, int numBins, double min, double max) { + // + // Histogram histogram1 = new Histogram(data, numBins, min, max); + // + // return chartPainter.getAxisPair().addSeries(seriesName, histogram1.getxAxisData(), histogram1.getyAxisData(), null); + // } /** * Set the chart title diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/Histogram.java b/xchart/src/main/java/com/xeiam/xchart/Histogram.java similarity index 69% rename from xchart/src/main/java/com/xeiam/xchart/internal/Histogram.java rename to xchart/src/main/java/com/xeiam/xchart/Histogram.java index cfd5d8a8a35411bfc18547a69cef6e5e6c5efabc..38b2a90e31a11975b5ecf627f27b5ba8c8cf979c 100644 --- a/xchart/src/main/java/com/xeiam/xchart/internal/Histogram.java +++ b/xchart/src/main/java/com/xeiam/xchart/Histogram.java @@ -13,20 +13,23 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.xeiam.xchart.internal; +package com.xeiam.xchart; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.Iterator; import java.util.List; /** + * This class can be used to create histogram data for histogram bar charts + * * @author timmolter */ public class Histogram { - private final List<Double> xAxisData; // bin centers - private final List<Double> yAxisData; // frequency counts + private List<Double> xAxisData; // bin centers + private List<Double> yAxisData; // frequency counts private final Collection<? extends Number> originalData; private final int numBins; private final double min; @@ -34,6 +37,34 @@ public class Histogram { /** * Constructor + * + * @param data + * @param numBins + */ + public Histogram(Collection<? extends Number> data, int numBins) { + + this.numBins = numBins; + this.originalData = data; + + List<Double> dataAsList = new ArrayList<Double>(); + Iterator<? extends Number> itr = data.iterator(); + while (itr.hasNext()) { + dataAsList.add(((Number) itr.next()).doubleValue()); + } + Collections.sort(dataAsList); + this.min = dataAsList.get(0); + this.max = dataAsList.get(dataAsList.size() - 1); + + init(); + } + + /** + * Constructor + * + * @param data + * @param numBins + * @param min + * @param max */ public Histogram(Collection<? extends Number> data, int numBins, double min, double max) { @@ -45,14 +76,19 @@ public class Histogram { // this.min = data[0]; // this.max = data[data.length - 1]; + init(); + } + + private void init() { + double[] tempYAxisData = new double[numBins]; final double binSize = (max - min) / numBins; // y axis data - Iterator<? extends Number> itr = data.iterator(); + Iterator<? extends Number> itr = originalData.iterator(); while (itr.hasNext()) { - int bin = (int) (((Double) itr.next() - min) / binSize); // changed this from numBins + int bin = (int) ((((Number) itr.next()).doubleValue() - min) / binSize); // changed this from numBins if (bin < 0) { /* this data is smaller than min */ } else if (bin >= numBins) { /* this data point is bigger than max */