From ebc75d7aa168325435b1a948e3ef6968a75b8e03 Mon Sep 17 00:00:00 2001 From: Tim Molter <tim@knowm.org> Date: Mon, 25 Jan 2016 15:46:33 +0100 Subject: [PATCH] Issue #124 - New Stick chart series render type --- .../org/knowm/xchart/demo/XChartDemo.java | 8 +++ .../demo/charts/stick/StickChart01.java | 69 +++++++++++++++++++ .../org/knowm/xchart/Series_Category.java | 14 +++- .../org/knowm/xchart/Styler_Category.java | 6 +- .../chartpart/PlotContent_Category_Bar.java | 39 ++++++++++- ...lotContent_Category_Line_Area_Scatter.java | 36 +++++++--- .../internal/chartpart/Plot_Category.java | 17 +++-- 7 files changed, 165 insertions(+), 24 deletions(-) create mode 100644 xchart-demo/src/main/java/org/knowm/xchart/demo/charts/stick/StickChart01.java diff --git a/xchart-demo/src/main/java/org/knowm/xchart/demo/XChartDemo.java b/xchart-demo/src/main/java/org/knowm/xchart/demo/XChartDemo.java index 3d78d702..f9af8b53 100644 --- a/xchart-demo/src/main/java/org/knowm/xchart/demo/XChartDemo.java +++ b/xchart-demo/src/main/java/org/knowm/xchart/demo/XChartDemo.java @@ -69,6 +69,7 @@ import org.knowm.xchart.demo.charts.scatter.ScatterChart01; import org.knowm.xchart.demo.charts.scatter.ScatterChart02; import org.knowm.xchart.demo.charts.scatter.ScatterChart03; import org.knowm.xchart.demo.charts.scatter.ScatterChart04; +import org.knowm.xchart.demo.charts.stick.StickChart01; import org.knowm.xchart.demo.charts.theme.ThemeChart01; import org.knowm.xchart.demo.charts.theme.ThemeChart02; import org.knowm.xchart.demo.charts.theme.ThemeChart03; @@ -307,6 +308,13 @@ public class XChartDemo extends JPanel implements TreeSelectionListener { defaultMutableTreeNode = new DefaultMutableTreeNode(new ChartInfo("BarChart09 - Category chart with Bar, Line and Scatter Series", new BarChart09().getChart())); category.add(defaultMutableTreeNode); + // Stick category + category = new DefaultMutableTreeNode("Stick Charts"); + top.add(category); + + defaultMutableTreeNode = new DefaultMutableTreeNode(new ChartInfo("StickChart01 - Stick", new StickChart01().getChart())); + category.add(defaultMutableTreeNode); + // Theme category category = new DefaultMutableTreeNode("Chart Themes"); top.add(category); diff --git a/xchart-demo/src/main/java/org/knowm/xchart/demo/charts/stick/StickChart01.java b/xchart-demo/src/main/java/org/knowm/xchart/demo/charts/stick/StickChart01.java new file mode 100644 index 00000000..cd73181d --- /dev/null +++ b/xchart-demo/src/main/java/org/knowm/xchart/demo/charts/stick/StickChart01.java @@ -0,0 +1,69 @@ +/** + * Copyright 2013 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 org.knowm.xchart.demo.charts.stick; + +import java.util.ArrayList; +import java.util.List; + +import org.knowm.xchart.ChartBuilder_Category; +import org.knowm.xchart.Chart_Category; +import org.knowm.xchart.Series_Category.ChartCategorySeriesRenderStyle; +import org.knowm.xchart.SwingWrapper; +import org.knowm.xchart.demo.charts.ExampleChart; +import org.knowm.xchart.internal.chartpart.Chart; +import org.knowm.xchart.internal.style.Styler.LegendPosition; + +/** + * Stick Chart + * <p> + * Demonstrates the following: + * <ul> + * <li>Stick category series render type + */ +public class StickChart01 implements ExampleChart { + + public static void main(String[] args) { + + ExampleChart exampleChart = new StickChart01(); + Chart chart = exampleChart.getChart(); + new SwingWrapper(chart).displayChart(); + } + + @Override + public Chart getChart() { + + // generates Log data + List<Integer> xData = new ArrayList<Integer>(); + List<Integer> yData = new ArrayList<Integer>(); + for (int i = -3; i <= 24; i++) { + xData.add(i); + yData.add(i); + } + + // Create Chart + Chart_Category chart = new ChartBuilder_Category().width(800).height(600).title("Stick").build(); + + // Customize Chart + chart.getStyler().setChartTitleVisible(true); + chart.getStyler().setLegendPosition(LegendPosition.InsideNW); + chart.getStyler().setChartCategorySeriesRenderStyle(ChartCategorySeriesRenderStyle.Stick); + + // Series + chart.addSeries("data", xData, yData); + + return chart; + } +} \ No newline at end of file diff --git a/xchart/src/main/java/org/knowm/xchart/Series_Category.java b/xchart/src/main/java/org/knowm/xchart/Series_Category.java index 2e7194da..ee1f5fd7 100644 --- a/xchart/src/main/java/org/knowm/xchart/Series_Category.java +++ b/xchart/src/main/java/org/knowm/xchart/Series_Category.java @@ -20,13 +20,13 @@ import java.util.Date; import java.util.Iterator; import java.util.List; -import org.knowm.xchart.internal.chartpart.Axis.AxisDataType; import org.knowm.xchart.internal.Series_AxesChart; +import org.knowm.xchart.internal.chartpart.Axis.AxisDataType; import org.knowm.xchart.internal.chartpart.RenderableSeries; import org.knowm.xchart.internal.chartpart.RenderableSeries.LegendRenderType; /** - * A Series containing X and Y data to be plotted on a Chart + * A Series containing category data to be plotted on a Chart * * @author timmolter */ @@ -34,7 +34,15 @@ public class Series_Category extends Series_AxesChart { public enum ChartCategorySeriesRenderStyle implements RenderableSeries { - Line(LegendRenderType.Line), Area(LegendRenderType.Line), Scatter(LegendRenderType.Scatter), Bar(LegendRenderType.Box); + Line(LegendRenderType.Line), + + Area(LegendRenderType.Line), + + Scatter(LegendRenderType.Scatter), + + Bar(LegendRenderType.Box), + + Stick(LegendRenderType.Line); private final LegendRenderType legendRenderType; diff --git a/xchart/src/main/java/org/knowm/xchart/Styler_Category.java b/xchart/src/main/java/org/knowm/xchart/Styler_Category.java index fc180b13..a5a0bd0c 100644 --- a/xchart/src/main/java/org/knowm/xchart/Styler_Category.java +++ b/xchart/src/main/java/org/knowm/xchart/Styler_Category.java @@ -39,7 +39,7 @@ public class Styler_Category extends Styler_AxesChart { @Override protected void setAllStyles() { - chartCategorySeriesRenderStyle = ChartCategorySeriesRenderStyle.Bar; // set default to bar + this.chartCategorySeriesRenderStyle = ChartCategorySeriesRenderStyle.Bar; // set default to bar } public ChartCategorySeriesRenderStyle getChartCategorySeriesRenderStyle() { @@ -48,9 +48,9 @@ public class Styler_Category extends Styler_AxesChart { } /** - * Sets the default series render style for the chart (line, scatter, area, etc.) You can override the series render style individually on each Series object. + * Sets the default series render style for the chart (bar, stick, line, scatter, area, etc.) You can override the series render style individually on each Series object. * - * @param chartXYSeriesRenderStyle + * @param chartCategorySeriesRenderStyle */ public void setChartCategorySeriesRenderStyle(ChartCategorySeriesRenderStyle chartCategorySeriesRenderStyle) { diff --git a/xchart/src/main/java/org/knowm/xchart/internal/chartpart/PlotContent_Category_Bar.java b/xchart/src/main/java/org/knowm/xchart/internal/chartpart/PlotContent_Category_Bar.java index 5166fe84..2364f2fc 100644 --- a/xchart/src/main/java/org/knowm/xchart/internal/chartpart/PlotContent_Category_Bar.java +++ b/xchart/src/main/java/org/knowm/xchart/internal/chartpart/PlotContent_Category_Bar.java @@ -43,7 +43,7 @@ public class PlotContent_Category_Bar<ST extends Styler, S extends Series> exten /** * Constructor * - * @param plot + * @param chart */ protected PlotContent_Category_Bar(Chart<Styler_Category, Series_Category> chart) { @@ -173,13 +173,23 @@ public class PlotContent_Category_Bar<ST extends Styler, S extends Series> exten double barWidthPercentage = stylerCategory.getBarWidthPercentage(); barWidth = gridStep * barWidthPercentage; double barMargin = gridStep * (1 - barWidthPercentage) / 2; - xOffset = bounds.getX() + xLeftMargin + gridStep * categoryCounter++ + barMargin; + if (ChartCategorySeriesRenderStyle.Stick.equals(series.getChartCategorySeriesRenderStyle())) { + xOffset = bounds.getX() + xLeftMargin + categoryCounter++ * gridStep + gridStep / 2; + } + else { + xOffset = bounds.getX() + xLeftMargin + gridStep * categoryCounter++ + barMargin; + } } else { double barWidthPercentage = stylerCategory.getBarWidthPercentage(); barWidth = gridStep / chart.getSeriesMap().size() * barWidthPercentage; double barMargin = gridStep * (1 - barWidthPercentage) / 2; - xOffset = bounds.getX() + xLeftMargin + gridStep * categoryCounter++ + seriesCounter * barWidth + barMargin; + if (ChartCategorySeriesRenderStyle.Stick.equals(series.getChartCategorySeriesRenderStyle())) { + xOffset = bounds.getX() + xLeftMargin + categoryCounter++ * gridStep + seriesCounter * barMargin + gridStep / chart.getSeriesMap().size() / 2; + } + else { + xOffset = bounds.getX() + xLeftMargin + gridStep * categoryCounter++ + seriesCounter * barWidth + barMargin; + } } // paint series @@ -200,6 +210,29 @@ public class PlotContent_Category_Bar<ST extends Styler, S extends Series> exten g.draw(path); } } + else if (ChartCategorySeriesRenderStyle.Stick.equals(series.getChartCategorySeriesRenderStyle())) { + + // paint line + if (series.getLineStyle() != SeriesLines.NONE) { + + g.setColor(series.getLineColor()); + g.setStroke(series.getLineStyle()); + Shape line = new Line2D.Double(xOffset, zeroOffset, xOffset, yOffset); + g.draw(line); + } + + // paint marker + if (series.getMarker() != null) { + g.setColor(series.getMarkerColor()); + + if (y <= 0) { + series.getMarker().paint(g, xOffset, zeroOffset, stylerCategory.getMarkerSize()); + } + else { + series.getMarker().paint(g, xOffset, yOffset, stylerCategory.getMarkerSize()); + } + } + } else { // paint line diff --git a/xchart/src/main/java/org/knowm/xchart/internal/chartpart/PlotContent_Category_Line_Area_Scatter.java b/xchart/src/main/java/org/knowm/xchart/internal/chartpart/PlotContent_Category_Line_Area_Scatter.java index 10c5452b..45b04879 100644 --- a/xchart/src/main/java/org/knowm/xchart/internal/chartpart/PlotContent_Category_Line_Area_Scatter.java +++ b/xchart/src/main/java/org/knowm/xchart/internal/chartpart/PlotContent_Category_Line_Area_Scatter.java @@ -48,7 +48,7 @@ public class PlotContent_Category_Line_Area_Scatter<ST extends Styler, S extends protected PlotContent_Category_Line_Area_Scatter(Chart<Styler_Category, Series_Category> chart) { super(chart); - this.stylerCategory = stylerCategory; + this.stylerCategory = chart.getStyler(); } @Override @@ -106,13 +106,15 @@ public class PlotContent_Category_Line_Area_Scatter<ST extends Styler, S extends yMin = Math.log10(yMin); yMax = Math.log10(yMax); } + System.out.println("yMin = " + yMin); + System.out.println("yMax = " + yMax); - Map<String, Series_Category> map = chart.getSeriesMap(); + Map<String, Series_Category> seriesMap = chart.getSeriesMap(); - int numCategories = map.size(); + int numCategories = seriesMap.values().iterator().next().getXData().size(); double gridStep = xTickSpace / numCategories; - for (Series_Category series : map.values()) { + for (Series_Category series : seriesMap.values()) { // data points Collection<? extends Number> yData = series.getYData(); @@ -154,7 +156,7 @@ public class PlotContent_Category_Line_Area_Scatter<ST extends Styler, S extends else { y = yOrig; } - // System.out.println(y); + System.out.println(y); double yTransform = bounds.getHeight() - (yTopMargin + (y - yMin) / (yMax - yMin) * yTickSpace); @@ -165,11 +167,10 @@ public class PlotContent_Category_Line_Area_Scatter<ST extends Styler, S extends double xOffset = bounds.getX() + xLeftMargin + categoryCounter++ * gridStep + gridStep / 2; double yOffset = bounds.getY() + yTransform; - // System.out.println(xTransform); - // System.out.println(xOffset); - // System.out.println(yTransform); - // System.out.println(yOffset); - // System.out.println("---"); + System.out.println(xOffset); + System.out.println(yTransform); + System.out.println(yOffset); + System.out.println("---"); // paint line if (ChartCategorySeriesRenderStyle.Line.equals(series.getChartCategorySeriesRenderStyle()) || ChartCategorySeriesRenderStyle.Area.equals(series.getChartCategorySeriesRenderStyle())) { @@ -205,6 +206,21 @@ public class PlotContent_Category_Line_Area_Scatter<ST extends Styler, S extends } } + // paint stick + if (ChartCategorySeriesRenderStyle.Stick.equals(series.getChartCategorySeriesRenderStyle())) { + + if (series.getLineStyle() != SeriesLines.NONE) { + + double yBottomOfArea = bounds.getY() + bounds.getHeight() - yTopMargin; + + g.setColor(series.getLineColor()); + g.setStroke(series.getLineStyle()); + Shape line = new Line2D.Double(xOffset, yBottomOfArea, xOffset, yOffset); + g.draw(line); + } + + } + previousX = xOffset; previousY = yOffset; diff --git a/xchart/src/main/java/org/knowm/xchart/internal/chartpart/Plot_Category.java b/xchart/src/main/java/org/knowm/xchart/internal/chartpart/Plot_Category.java index 19754072..e90da768 100644 --- a/xchart/src/main/java/org/knowm/xchart/internal/chartpart/Plot_Category.java +++ b/xchart/src/main/java/org/knowm/xchart/internal/chartpart/Plot_Category.java @@ -16,17 +16,21 @@ */ package org.knowm.xchart.internal.chartpart; +import java.awt.Graphics2D; + import org.knowm.xchart.Series_Category; import org.knowm.xchart.Series_Category.ChartCategorySeriesRenderStyle; +import org.knowm.xchart.Styler_Category; import org.knowm.xchart.internal.Series; import org.knowm.xchart.internal.style.Styler_AxesChart; -import org.knowm.xchart.Styler_Category; /** * @author timmolter */ public class Plot_Category<ST extends Styler_AxesChart, S extends Series> extends Plot_AxesChart { + Styler_Category stylerCategory; + /** * Constructor * @@ -35,19 +39,22 @@ public class Plot_Category<ST extends Styler_AxesChart, S extends Series> extend public Plot_Category(Chart<Styler_Category, Series_Category> chart) { super(chart); + stylerCategory = chart.getStyler(); + } - Styler_Category stylerCategory = chart.getStyler(); + @Override + public void paint(Graphics2D g) { - if (ChartCategorySeriesRenderStyle.Bar.equals(stylerCategory.getChartCategorySeriesRenderStyle())) { + if (ChartCategorySeriesRenderStyle.Bar.equals(stylerCategory.getChartCategorySeriesRenderStyle()) || ChartCategorySeriesRenderStyle.Stick.equals(stylerCategory + .getChartCategorySeriesRenderStyle())) { this.plotContent = new PlotContent_Category_Bar<Styler_Category, Series_Category>(chart); - } else { this.plotContent = new PlotContent_Category_Line_Area_Scatter<Styler_Category, Series_Category>(chart); - } + super.paint(g); } } -- GitLab