From 057c1849d7876f450d6c111fcbdcbc8acfb199dd Mon Sep 17 00:00:00 2001 From: Tim Molter <tim@knowm.org> Date: Fri, 22 Jan 2016 18:02:58 +0100 Subject: [PATCH] allowing setting of annotation distance from center on pie chart, as well as the pie chart annotation font --- .../java/org/knowm/xchart/Styler_Pie.java | 36 +++++++++++++++++++ .../internal/chartpart/PlotContent_Pie.java | 6 ++-- .../knowm/xchart/internal/style/Theme_.java | 4 +++ .../xchart/internal/style/Theme_GGPlot2.java | 12 +++++++ .../xchart/internal/style/Theme_Matlab.java | 12 +++++++ .../xchart/internal/style/Theme_XChart.java | 12 +++++++ 6 files changed, 79 insertions(+), 3 deletions(-) diff --git a/xchart/src/main/java/org/knowm/xchart/Styler_Pie.java b/xchart/src/main/java/org/knowm/xchart/Styler_Pie.java index 3608a056..916590fc 100644 --- a/xchart/src/main/java/org/knowm/xchart/Styler_Pie.java +++ b/xchart/src/main/java/org/knowm/xchart/Styler_Pie.java @@ -16,6 +16,8 @@ */ package org.knowm.xchart; +import java.awt.Font; + import org.knowm.xchart.Series_Pie.ChartPieSeriesRenderStyle; import org.knowm.xchart.internal.style.Styler; import org.knowm.xchart.internal.style.Theme_; @@ -30,6 +32,8 @@ public class Styler_Pie extends Styler { private double pieFillPercentage; private boolean isCircular; private double startAngleInDegrees; + private Font pieFont; + private double annotationDistance; /** * Constructor @@ -46,6 +50,8 @@ public class Styler_Pie extends Styler { chartPieSeriesRenderStyle = ChartPieSeriesRenderStyle.Pie; // set default to pie, donut may be a future one pieFillPercentage = theme.getPieFillPercentage(); isCircular = theme.isCircular(); + pieFont = theme.getPieFont(); + annotationDistance = theme.getAnnotationDistance(); } public ChartPieSeriesRenderStyle getChartPieSeriesRenderStyle() { @@ -108,6 +114,36 @@ public class Styler_Pie extends Styler { this.startAngleInDegrees = startAngleInDegrees; } + public Font getPieFont() { + + return pieFont; + } + + /** + * Sets the font used on the Pie Chart's annotations + * + * @param pieFont + */ + public void setPieFont(Font pieFont) { + + this.pieFont = pieFont; + } + + public double getAnnotationDistance() { + + return annotationDistance; + } + + /** + * Sets the distance of the pie chart's annotation where 0 is the center, 1 is at the edge and greater than 1 is outside of the pie chart. + * + * @param annotationDistance + */ + public void setAnnotationDistance(double annotationDistance) { + + this.annotationDistance = annotationDistance; + } + /** * Set the theme the styler 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 d6accee1..907f9b89 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 @@ -127,14 +127,14 @@ public class PlotContent_Pie<ST extends Styler, S extends Series> extends PlotCo // draw percentage on slice double percentage = y.doubleValue() / total * 100; - TextLayout textLayout = new TextLayout(df.format(percentage) + "%", chart.getStyler().getLegendFont(), new FontRenderContext(null, true, false)); + TextLayout textLayout = new TextLayout(df.format(percentage) + "%", stylerPie.getPieFont(), new FontRenderContext(null, true, false)); Rectangle2D percentageRectangle = textLayout.getBounds(); double xCenter = pieBounds.getX() + pieBounds.getWidth() / 2 - percentageRectangle.getWidth() / 2; double yCenter = pieBounds.getY() + pieBounds.getHeight() / 2 + percentageRectangle.getHeight() / 2; double angle = (arcAngle + startAngle) - arcAngle / 2; - double xOffset = xCenter + Math.cos(Math.toRadians(angle)) * (pieBounds.getWidth() / 3.33); - double yOffset = yCenter - Math.sin(Math.toRadians(angle)) * (pieBounds.getHeight() / 3.33); + double xOffset = xCenter + Math.cos(Math.toRadians(angle)) * (pieBounds.getWidth() / 2 * stylerPie.getAnnotationDistance()); + double yOffset = yCenter - Math.sin(Math.toRadians(angle)) * (pieBounds.getHeight() / 2 * stylerPie.getAnnotationDistance()); g.setColor(stylerPie.getChartFontColor()); g.setFont(stylerPie.getChartTitleFont()); 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 d52ca4ab..f985dcfb 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 @@ -140,6 +140,10 @@ public interface Theme_ extends SeriesMarkers, SeriesLines, SeriesColors { public double getStartAngleInDegrees(); + public Font getPieFont(); + + public double getAnnotationDistance(); + // Line, Scatter, Area Charts /////////////////////////////// public int getMarkerSize(); diff --git a/xchart/src/main/java/org/knowm/xchart/internal/style/Theme_GGPlot2.java b/xchart/src/main/java/org/knowm/xchart/internal/style/Theme_GGPlot2.java index 33b047d5..f5cc3279 100644 --- a/xchart/src/main/java/org/knowm/xchart/internal/style/Theme_GGPlot2.java +++ b/xchart/src/main/java/org/knowm/xchart/internal/style/Theme_GGPlot2.java @@ -354,6 +354,18 @@ public class Theme_GGPlot2 implements Theme_ { return 0; } + @Override + public Font getPieFont() { + + return new Font(Font.SANS_SERIF, Font.PLAIN, 15); + } + + @Override + public double getAnnotationDistance() { + + return .67; + } + // Line, Scatter, Area Charts /////////////////////////////// @Override diff --git a/xchart/src/main/java/org/knowm/xchart/internal/style/Theme_Matlab.java b/xchart/src/main/java/org/knowm/xchart/internal/style/Theme_Matlab.java index 569d3486..04f12954 100644 --- a/xchart/src/main/java/org/knowm/xchart/internal/style/Theme_Matlab.java +++ b/xchart/src/main/java/org/knowm/xchart/internal/style/Theme_Matlab.java @@ -358,6 +358,18 @@ public class Theme_Matlab implements Theme_ { return 0; } + @Override + public Font getPieFont() { + + return new Font(Font.SANS_SERIF, Font.PLAIN, 15); + } + + @Override + public double getAnnotationDistance() { + + return .67; + } + // Line, Scatter, Area Charts /////////////////////////////// @Override diff --git a/xchart/src/main/java/org/knowm/xchart/internal/style/Theme_XChart.java b/xchart/src/main/java/org/knowm/xchart/internal/style/Theme_XChart.java index 8ea4902a..ceaacec3 100644 --- a/xchart/src/main/java/org/knowm/xchart/internal/style/Theme_XChart.java +++ b/xchart/src/main/java/org/knowm/xchart/internal/style/Theme_XChart.java @@ -354,6 +354,18 @@ public class Theme_XChart implements Theme_ { return 0; } + @Override + public Font getPieFont() { + + return new Font(Font.SANS_SERIF, Font.PLAIN, 15); + } + + @Override + public double getAnnotationDistance() { + + return .67; + } + // Line, Scatter, Area Charts /////////////////////////////// @Override -- GitLab