diff --git a/xchart-demo/src/main/java/org/knowm/xchart/demo/charts/pie/PieChart02.java b/xchart-demo/src/main/java/org/knowm/xchart/demo/charts/pie/PieChart02.java index 9b4af0025fad87817224a2372f82a1b8c205f763..268fe317f1d6755e68b2e8e03a5f2a28048ecdd2 100644 --- a/xchart-demo/src/main/java/org/knowm/xchart/demo/charts/pie/PieChart02.java +++ b/xchart-demo/src/main/java/org/knowm/xchart/demo/charts/pie/PieChart02.java @@ -20,6 +20,7 @@ import java.awt.Color; import org.knowm.xchart.ChartBuilderPie; import org.knowm.xchart.Chart_Pie; +import org.knowm.xchart.Series_Pie; import org.knowm.xchart.SwingWrapper; import org.knowm.xchart.demo.charts.ExampleChart; @@ -48,7 +49,8 @@ public class PieChart02 implements ExampleChart<Chart_Pie> { Chart_Pie chart = new ChartBuilderPie().width(800).height(600).title(getClass().getSimpleName()).build(); chart.addSeries("Gold", 24); chart.addSeries("Silver", 21); - chart.addSeries("Platinum", 39); + Series_Pie series = chart.addSeries("Platinum", 39); + chart.addSeries("Copper", 17); chart.addSeries("Zinc", 40); diff --git a/xchart/src/main/java/org/knowm/xchart/Chart_Pie.java b/xchart/src/main/java/org/knowm/xchart/Chart_Pie.java index e6452a4ce1b4e2d2f87c4bdf4a23adfc2119ced7..aa2b8015f9cb7cc7a90fd66207934c2edea4f695 100644 --- a/xchart/src/main/java/org/knowm/xchart/Chart_Pie.java +++ b/xchart/src/main/java/org/knowm/xchart/Chart_Pie.java @@ -91,7 +91,7 @@ public class Chart_Pie extends Chart<StyleManagerPie, Series_Pie> { * @param value * @return */ - public Series addSeries(String seriesName, Number value) { + public Series_Pie addSeries(String seriesName, Number value) { Series_Pie series = new Series_Pie(seriesName, value); diff --git a/xchart/src/main/java/org/knowm/xchart/StyleManagerPie.java b/xchart/src/main/java/org/knowm/xchart/StyleManagerPie.java index 2e3c8e6dd153f35befcb1bda22c62e402655a49f..b78b68bcad616ebd674222d6ac7f85d39fe73941 100644 --- a/xchart/src/main/java/org/knowm/xchart/StyleManagerPie.java +++ b/xchart/src/main/java/org/knowm/xchart/StyleManagerPie.java @@ -27,6 +27,9 @@ public class StyleManagerPie extends StyleManager { private ChartPieSeriesRenderStyle chartPieSeriesRenderStyle; + private double pieFillPercentage; + private boolean isCircular; + /** * Constructor */ @@ -39,7 +42,9 @@ public class StyleManagerPie extends StyleManager { @Override protected void setAllStyles() { - chartPieSeriesRenderStyle = ChartPieSeriesRenderStyle.Pie; // set default to area + chartPieSeriesRenderStyle = ChartPieSeriesRenderStyle.Pie; // set default to pie, donut may be a future one + pieFillPercentage = theme.getPieFillPercentage(); + isCircular = theme.isCircular(); } public ChartPieSeriesRenderStyle getChartPieSeriesRenderStyle() { @@ -57,6 +62,36 @@ public class StyleManagerPie extends StyleManager { this.chartPieSeriesRenderStyle = chartPieSeriesRenderStyle; } + public double getPieFillPercentage() { + + return pieFillPercentage; + } + + /** + * Sets the amount of space that the pie chart fills. Full fill is 100%, i.e. 1.0 + * + * @param pieFillPercentage + */ + public void setPieFillPercentage(double pieFillPercentage) { + + this.pieFillPercentage = pieFillPercentage; + } + + public boolean isCircular() { + + return isCircular; + } + + /** + * Sets whether or not the pie chart is forced to be circular. Otherwise it's shape is oval, matching the containing plot. + * + * @param isCircular + */ + public void setCircular(boolean isCircular) { + + this.isCircular = isCircular; + } + /** * Set the theme the style manager should use * diff --git a/xchart/src/main/java/org/knowm/xchart/internal/chartpart/PlotContent_Pie.java b/xchart/src/main/java/org/knowm/xchart/internal/chartpart/PlotContent_Pie.java index 647dd74cb94292ee6f9e5bab5105b254015d5aed..768d1a0fb09f6dadb6d4c7506df93a3e845d9e5b 100644 --- a/xchart/src/main/java/org/knowm/xchart/internal/chartpart/PlotContent_Pie.java +++ b/xchart/src/main/java/org/knowm/xchart/internal/chartpart/PlotContent_Pie.java @@ -66,13 +66,30 @@ public class PlotContent_Pie<SM extends StyleManager, S extends Series> extends g.setClip(bounds.createIntersection(rectangle)); // pie bounds - double percentage = .70; + double percentage = styleManagerPie.getPieFillPercentage(); + + // if (styleManagerPie.isCircular()) { + // + // double pieDiameter = Math.min(bounds.getWidth(), bounds.getHeight()); + // } + double halfBorderPercentage = (1 - percentage) / 2.0; - Rectangle2D pieBounds = new Rectangle2D.Double(bounds.getX() + bounds.getWidth() * halfBorderPercentage, bounds.getY() + bounds.getHeight() * halfBorderPercentage, bounds.getWidth() * percentage, - bounds.getHeight() * percentage); - // g.setStroke(new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL)); - // g.setColor(Color.black); - // g.draw(pieBounds); + double width = styleManagerPie.isCircular() ? Math.min(bounds.getWidth(), bounds.getHeight()) : bounds.getWidth(); + double height = styleManagerPie.isCircular() ? Math.min(bounds.getWidth(), bounds.getHeight()) : bounds.getHeight(); + + Rectangle2D pieBounds = new Rectangle2D.Double( + + bounds.getX() + bounds.getWidth() / 2 - width / 2 + halfBorderPercentage * width, + + bounds.getY() + bounds.getHeight() / 2 - height / 2 + halfBorderPercentage * height, + + width * percentage, + + height * percentage); + + // g.setStroke(new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL)); + // g.setColor(Color.black); + // g.draw(pieBounds); // get total double total = 0.0; diff --git a/xchart/src/main/java/org/knowm/xchart/internal/style/GGPlot2Theme.java b/xchart/src/main/java/org/knowm/xchart/internal/style/GGPlot2Theme.java index 5909d99d6256b7f78443b05833564b518f978812..e8086333037e036ed09f963029be0965fced0aa3 100644 --- a/xchart/src/main/java/org/knowm/xchart/internal/style/GGPlot2Theme.java +++ b/xchart/src/main/java/org/knowm/xchart/internal/style/GGPlot2Theme.java @@ -334,6 +334,20 @@ public class GGPlot2Theme implements Theme { return true; } + // Pie Charts /////////////////////////////// + + @Override + public double getPieFillPercentage() { + + return .90; + } + + @Override + public boolean isCircular() { + + return true; + } + // Line, Scatter, Area Charts /////////////////////////////// @Override diff --git a/xchart/src/main/java/org/knowm/xchart/internal/style/MatlabTheme.java b/xchart/src/main/java/org/knowm/xchart/internal/style/MatlabTheme.java index 1749f61cd0f811ba47f357fd526183fc54d4044f..59ed862dd31538ad334e589eeeab2110f7d8e2ce 100644 --- a/xchart/src/main/java/org/knowm/xchart/internal/style/MatlabTheme.java +++ b/xchart/src/main/java/org/knowm/xchart/internal/style/MatlabTheme.java @@ -338,6 +338,20 @@ public class MatlabTheme implements Theme { return true; } + // Pie Charts /////////////////////////////// + + @Override + public double getPieFillPercentage() { + + return .90; + } + + @Override + public boolean isCircular() { + + return true; + } + // Line, Scatter, Area Charts /////////////////////////////// @Override diff --git a/xchart/src/main/java/org/knowm/xchart/internal/style/Theme.java b/xchart/src/main/java/org/knowm/xchart/internal/style/Theme.java index eb8e8388d179d40847fcdd99cb72dc628727f556..2297cfaf16a96df688806ff525bb9c282957cb40 100644 --- a/xchart/src/main/java/org/knowm/xchart/internal/style/Theme.java +++ b/xchart/src/main/java/org/knowm/xchart/internal/style/Theme.java @@ -132,6 +132,12 @@ public interface Theme extends SeriesMarkers, SeriesLines, SeriesColors { public boolean isBarFilled(); + // Pie Charts /////////////////////////////// + + public double getPieFillPercentage(); + + public boolean isCircular(); + // Line, Scatter, Area Charts /////////////////////////////// public int getMarkerSize(); diff --git a/xchart/src/main/java/org/knowm/xchart/internal/style/XChartTheme.java b/xchart/src/main/java/org/knowm/xchart/internal/style/XChartTheme.java index 888cd960cf07ec6850940e4cc9bc92b0f04832ae..61e52800ee89edd47cf8bce20845db1c67d3b0d1 100644 --- a/xchart/src/main/java/org/knowm/xchart/internal/style/XChartTheme.java +++ b/xchart/src/main/java/org/knowm/xchart/internal/style/XChartTheme.java @@ -334,6 +334,20 @@ public class XChartTheme implements Theme { return true; } + // Pie Charts /////////////////////////////// + + @Override + public double getPieFillPercentage() { + + return .90; + } + + @Override + public boolean isCircular() { + + return true; + } + // Line, Scatter, Area Charts /////////////////////////////// @Override