diff --git a/README.md b/README.md index 839ab65f5bb227b611e925c0569e0471e18c15d5..fba36b1e01719898fb55a31660564431606ba7f9 100644 --- a/README.md +++ b/README.md @@ -49,10 +49,13 @@ Now go ahead and [study some more examples](http://xeiam.com/xchart_examplecode. * Real-time charts ## Getting Started + ### Non-Maven + Download Jar: http://xeiam.com/xchart_changelog.jsp ### Maven + The XChart release artifacts are hosted on Maven Central. Add the XChart library as a dependency to your pom.xml file: @@ -104,3 +107,6 @@ Please report any bugs or submit feature requests to [XChart's Github issue trac ## Donations 1PrZHiJorAw7RQrjP9CJgtPuqr6fU65PKt +## Release Information + +We will announce new releases on our [Twitter page](https://twitter.com/Xeiam). \ No newline at end of file diff --git a/xchart-demo/src/main/java/com/xeiam/xchart/standalone/Example0.java b/xchart-demo/src/main/java/com/xeiam/xchart/standalone/Example0.java index 4e0a6fbecd27e419f40e0ea4eb920d75baa6c180..c50d3d0696cb65460526189f54c7837a9d58b4b9 100644 --- a/xchart-demo/src/main/java/com/xeiam/xchart/standalone/Example0.java +++ b/xchart-demo/src/main/java/com/xeiam/xchart/standalone/Example0.java @@ -15,7 +15,6 @@ */ package com.xeiam.xchart.standalone; -import com.xeiam.xchart.BitmapEncoder; import com.xeiam.xchart.Chart; import com.xeiam.xchart.QuickChart; import com.xeiam.xchart.SwingWrapper; @@ -36,9 +35,5 @@ public class Example0 { // Show it new SwingWrapper(chart).displayChart(); - // Save it - BitmapEncoder.savePNG(chart, "./Sample_Chart.png"); - BitmapEncoder.savePNGWithDPI(chart, "./Sample_Chart_300_DPI.png", 300); - } } diff --git a/xchart/src/main/java/com/xeiam/xchart/StyleManager.java b/xchart/src/main/java/com/xeiam/xchart/StyleManager.java index 5b50fa7965ded5c1a0b952a828130327d76e5969..8d20a5c6390e292a12a02a470b80c21d1b2e8906 100644 --- a/xchart/src/main/java/com/xeiam/xchart/StyleManager.java +++ b/xchart/src/main/java/com/xeiam/xchart/StyleManager.java @@ -129,7 +129,10 @@ public class StyleManager { // Bar Charts /////////////////////////////// private double barWidthPercentage; - private boolean barsOverlapped; + private boolean isBarsOverlapped; + + // Line, Scatter, Area Charts /////////////////////////////// + private int markerSize; // Error Bars /////////////////////////////// private Color errorBarsColor; @@ -211,7 +214,11 @@ public class StyleManager { // Bar Charts /////////////////////////////// barWidthPercentage = theme.getBarWidthPercentage(); - barsOverlapped = theme.barsOverlapped(); + isBarsOverlapped = theme.isBarsOverlapped(); + + // Line, Scatter, Area Charts /////////////////////////////// + + markerSize = theme.getMarkerSize(); // Error Bars /////////////////////////////// errorBarsColor = theme.getErrorBarsColor(); @@ -994,16 +1001,33 @@ public class StyleManager { /** * set whether or no bars are overlapped. Otherwise they are places side-by-side * - * @param barsOverlapped + * @param isBarsOverlapped + */ + public void setBarsOverlapped(boolean isBarsOverlapped) { + + this.isBarsOverlapped = isBarsOverlapped; + } + + public boolean isBarsOverlapped() { + + return isBarsOverlapped; + } + + // Line, Scatter, Area Charts /////////////////////////////// + + /** + * Sets the size of the markers in pixels + * + * @param markerSize */ - public void setBarsOverlapped(boolean barsOverlapped) { + public void setMarkerSize(int markerSize) { - this.barsOverlapped = barsOverlapped; + this.markerSize = markerSize; } - public boolean barsOverlapped() { + public int getMarkerSize() { - return barsOverlapped; + return markerSize; } // Error Bars /////////////////////////////// diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/Legend.java b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/Legend.java index 1d0f74a843fa91cb4872ecee1f99ac1cb0525b01..70bc61698535c2315192c8170570fb62db24fa3e 100644 --- a/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/Legend.java +++ b/xchart/src/main/java/com/xeiam/xchart/internal/chartpart/Legend.java @@ -29,7 +29,6 @@ import java.util.Map; import com.xeiam.xchart.Series; import com.xeiam.xchart.StyleManager; import com.xeiam.xchart.StyleManager.ChartType; -import com.xeiam.xchart.internal.markers.Marker; /** * @author timmolter @@ -90,7 +89,7 @@ public class Legend implements ChartPart { legendTextContentMaxWidth = Math.max(legendTextContentMaxWidth, entry.getValue().getWidth()); } - blockHeight = Math.max(blockHeight, isBar ? BOX_SIZE : Marker.SIZE); + blockHeight = Math.max(blockHeight, isBar ? BOX_SIZE : getChartPainter().getStyleManager().getMarkerSize()); legendTextContentMaxHeight = Math.max(legendTextContentMaxHeight, blockHeight); legendContentHeight += blockHeight; @@ -133,8 +132,9 @@ public class Legend implements ChartPart { StyleManager styleManager = getChartPainter().getStyleManager(); - if (!styleManager.isLegendVisible()) + if (!styleManager.isLegendVisible()) { return; + } final double[] sizeHint = getSizeHint(g); @@ -190,8 +190,9 @@ public class Legend implements ChartPart { for (Series series : chartPainter.getAxisPair().getSeriesMap().values()) { List<Map.Entry<String, Rectangle2D>> seriesBounds = getSeriesBounds(series, g); float blockHeight = 0; - for (Map.Entry<String, Rectangle2D> entry : seriesBounds) + for (Map.Entry<String, Rectangle2D> entry : seriesBounds) { blockHeight += entry.getValue().getHeight(); + } if (styleManager.getChartType() != ChartType.Bar) { // paint line @@ -205,7 +206,7 @@ public class Legend implements ChartPart { // paint marker if (series.getMarker() != null) { g.setColor(series.getMarkerColor()); - series.getMarker().paint(g, startx + styleManager.getLegendSeriesLineLength() / 2.0, starty + blockHeight / 2.0); + series.getMarker().paint(g, startx + styleManager.getLegendSeriesLineLength() / 2.0, starty + blockHeight / 2.0, getChartPainter().getStyleManager().getMarkerSize()); } } else { @@ -227,7 +228,7 @@ public class Legend implements ChartPart { g.drawString(entry.getKey(), x, (float) (starty + entry.getValue().getHeight()) + itemOffsetY); itemOffsetY += entry.getValue().getHeight(); } - itemOffsetY = (float) Math.max(itemOffsetY, Marker.SIZE); + itemOffsetY = Math.max(itemOffsetY, getChartPainter().getStyleManager().getMarkerSize()); starty += blockHeight + fontMetrics.getDescent(); } else { 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 318e793c51f523ea17483a561aaf39cad05152b5..e657735472bba3810b3797ae6dd3f338db02a56a 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 @@ -170,7 +170,7 @@ public class PlotContentBarChart extends PlotContent { boolean isOverlap = true; double xOffset; double barWidth; - if (getChartPainter().getStyleManager().barsOverlapped()) { + if (getChartPainter().getStyleManager().isBarsOverlapped()) { double barWidthPercentage = getChartPainter().getStyleManager().getBarWidthPercentage(); barWidth = gridStep * barWidthPercentage; double barMargin = gridStep * (1 - barWidthPercentage) / 2; 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 d08eebb7f98c40cf9e027dbf14ff8f7e5d3ef69e..f7783afef9d16177b5f7e988541979f8da9d79e5 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 @@ -205,7 +205,7 @@ public class PlotContentLineChart extends PlotContent { // paint marker if (series.getMarker() != null) { g.setColor(series.getMarkerColor()); - series.getMarker().paint(g, xOffset, yOffset); + series.getMarker().paint(g, xOffset, yOffset, getChartPainter().getStyleManager().getMarkerSize()); } // paint errorbars diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/markers/Circle.java b/xchart/src/main/java/com/xeiam/xchart/internal/markers/Circle.java index b3cd237d7cb2d3c483343b72a24f3519598638d6..489f7abf0d6efaa440ffc9f0cb97ee25c087dac2 100644 --- a/xchart/src/main/java/com/xeiam/xchart/internal/markers/Circle.java +++ b/xchart/src/main/java/com/xeiam/xchart/internal/markers/Circle.java @@ -25,10 +25,11 @@ import java.awt.geom.Ellipse2D; public class Circle extends Marker { @Override - public void paint(Graphics2D g, double xOffset, double yOffset) { + public void paint(Graphics2D g, double xOffset, double yOffset, int markerSize) { g.setStroke(stroke); - Shape circle = new Ellipse2D.Double(xOffset - Marker.HALF_SIZE, yOffset - Marker.HALF_SIZE, Marker.SIZE, Marker.SIZE); + double halfSize = (double) markerSize / 2; + Shape circle = new Ellipse2D.Double(xOffset - halfSize, yOffset - halfSize, markerSize, markerSize); g.fill(circle); } diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/markers/Diamond.java b/xchart/src/main/java/com/xeiam/xchart/internal/markers/Diamond.java index 4a5d0abc6bca936551f2587568dbb71c873ed3d1..78f9883ec50ca6387ba63403ea194678dacaa8fe 100644 --- a/xchart/src/main/java/com/xeiam/xchart/internal/markers/Diamond.java +++ b/xchart/src/main/java/com/xeiam/xchart/internal/markers/Diamond.java @@ -24,12 +24,12 @@ import java.awt.geom.Path2D; public class Diamond extends Marker { @Override - public void paint(Graphics2D g, double xOffset, double yOffset) { + public void paint(Graphics2D g, double xOffset, double yOffset, int markerSize) { g.setStroke(stroke); // Make a diamond - double diamondHalfSize = Marker.HALF_SIZE * 1.3; + double diamondHalfSize = (double) markerSize / 2 * 1.3; Path2D.Double path = new Path2D.Double(); path.moveTo(xOffset - diamondHalfSize, yOffset); diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/markers/Marker.java b/xchart/src/main/java/com/xeiam/xchart/internal/markers/Marker.java index dd24d7f3ccdf6c4fa84b5ebf73decc17fb46b663..42ba4e3ca51cb57b29d619a716922295fc6901e3 100644 --- a/xchart/src/main/java/com/xeiam/xchart/internal/markers/Marker.java +++ b/xchart/src/main/java/com/xeiam/xchart/internal/markers/Marker.java @@ -25,9 +25,6 @@ public abstract class Marker { protected BasicStroke stroke = new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL); - public static final double SIZE = 8; + public abstract void paint(Graphics2D g, double xOffset, double yOffset, int markerSize); - public static final double HALF_SIZE = SIZE / 2.0; - - public abstract void paint(Graphics2D g, double xOffset, double yOffset); } diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/markers/Square.java b/xchart/src/main/java/com/xeiam/xchart/internal/markers/Square.java index 2848423b170797189b6b62cf7a6cd2af617d7def..f297ebdb6dabe501f56523b8a7a6084202014db1 100644 --- a/xchart/src/main/java/com/xeiam/xchart/internal/markers/Square.java +++ b/xchart/src/main/java/com/xeiam/xchart/internal/markers/Square.java @@ -25,10 +25,11 @@ import java.awt.geom.Rectangle2D; public class Square extends Marker { @Override - public void paint(Graphics2D g, double xOffset, double yOffset) { + public void paint(Graphics2D g, double xOffset, double yOffset, int markerSize) { g.setStroke(stroke); - Shape square = new Rectangle2D.Double(xOffset - Marker.HALF_SIZE, yOffset - Marker.HALF_SIZE, Marker.SIZE, Marker.SIZE); + double halfSize = (double) markerSize / 2; + Shape square = new Rectangle2D.Double(xOffset - halfSize, yOffset - halfSize, markerSize, markerSize); g.fill(square); } diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/markers/TriangleDown.java b/xchart/src/main/java/com/xeiam/xchart/internal/markers/TriangleDown.java index 19dc130c8d38d4089e3a716578da4dd2a9842882..6a28809d367df7b875234caf22773d2a3f38ca1d 100644 --- a/xchart/src/main/java/com/xeiam/xchart/internal/markers/TriangleDown.java +++ b/xchart/src/main/java/com/xeiam/xchart/internal/markers/TriangleDown.java @@ -24,15 +24,16 @@ import java.awt.geom.Path2D; public class TriangleDown extends Marker { @Override - public void paint(Graphics2D g, double xOffset, double yOffset) { + public void paint(Graphics2D g, double xOffset, double yOffset, int markerSize) { g.setStroke(stroke); + double halfSize = (double) markerSize / 2; // Make a triangle Path2D.Double path = new Path2D.Double(); - path.moveTo(xOffset - Marker.HALF_SIZE, 1 + yOffset - Marker.HALF_SIZE); - path.lineTo(xOffset, 1 + yOffset - Marker.HALF_SIZE + Marker.SIZE + 1); - path.lineTo(xOffset - Marker.HALF_SIZE + Marker.SIZE + 1, 1 + yOffset - Marker.HALF_SIZE); + path.moveTo(xOffset - halfSize, 1 + yOffset - halfSize); + path.lineTo(xOffset, 1 + yOffset - halfSize + markerSize + 1); + path.lineTo(xOffset - halfSize + markerSize + 1, 1 + yOffset - halfSize); path.closePath(); g.fill(path); diff --git a/xchart/src/main/java/com/xeiam/xchart/internal/markers/TriangleUp.java b/xchart/src/main/java/com/xeiam/xchart/internal/markers/TriangleUp.java index 7f9bf7087e15e26319b698e0c463b7dde1363318..ebd4abe8489c331e2363c0e1b6b4f247d35191a0 100644 --- a/xchart/src/main/java/com/xeiam/xchart/internal/markers/TriangleUp.java +++ b/xchart/src/main/java/com/xeiam/xchart/internal/markers/TriangleUp.java @@ -24,15 +24,16 @@ import java.awt.geom.Path2D; public class TriangleUp extends Marker { @Override - public void paint(Graphics2D g, double xOffset, double yOffset) { + public void paint(Graphics2D g, double xOffset, double yOffset, int markerSize) { g.setStroke(stroke); + double halfSize = (double) markerSize / 2; // Make a triangle Path2D.Double path = new Path2D.Double(); - path.moveTo(xOffset - Marker.HALF_SIZE, yOffset - Marker.HALF_SIZE + Marker.SIZE + 1); - path.lineTo(xOffset - Marker.HALF_SIZE + Marker.SIZE + 1, yOffset - Marker.HALF_SIZE + Marker.SIZE + 1); - path.lineTo(xOffset, yOffset - Marker.HALF_SIZE); + path.moveTo(xOffset - halfSize, yOffset - halfSize + markerSize + 1); + path.lineTo(xOffset - halfSize + markerSize + 1, yOffset - halfSize + markerSize + 1); + path.lineTo(xOffset, yOffset - halfSize); 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 1c99fe3c947592dff76fa03256eb6df37539dde2..3ccbfcbfca171db5abd305c92afb33152cfbba5f 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 @@ -288,11 +288,19 @@ public class GGPlot2Theme implements Theme { } @Override - public boolean barsOverlapped() { + public boolean isBarsOverlapped() { return false; } + // Line, Scatter, Area Charts /////////////////////////////// + + @Override + public int getMarkerSize() { + + return 8; + } + // 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 56bdc5f4d67ae4ea48c828cdbe0a9e739d01112f..d329e10e561c5f6353ff8a22017bef405adb2683 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 @@ -289,11 +289,19 @@ public class MatlabTheme implements Theme { } @Override - public boolean barsOverlapped() { + public boolean isBarsOverlapped() { return false; } + // Line, Scatter, Area Charts /////////////////////////////// + + @Override + public int getMarkerSize() { + + return 8; + } + // 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 e4e37fe3f6885ad0e51e133215a7e3d2ae801cea..d67e64250ef3859ac47707a9c189809479227cf3 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 @@ -120,7 +120,11 @@ public interface Theme { public double getBarWidthPercentage(); - public boolean barsOverlapped(); + public boolean isBarsOverlapped(); + + // Line, Scatter, Area Charts /////////////////////////////// + + public int getMarkerSize(); // Error Bars /////////////////////////////// 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 1afe96c09037759ef769451113e8749a8f54c637..bd292dd16924083a235c7aaa69df0b38c8b9b1bc 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 @@ -288,11 +288,19 @@ public class XChartTheme implements Theme { } @Override - public boolean barsOverlapped() { + public boolean isBarsOverlapped() { return false; } + // Line, Scatter, Area Charts /////////////////////////////// + + @Override + public int getMarkerSize() { + + return 8; + } + // Error Bars /////////////////////////////// @Override