The following illustration shows the end result. It shows both the samples in red and an orange trend curve.

### The Java Code

To create the trend curve, I've used a polynomial fitting algorithm to calculate the best fitting polynomial coefficients. The sample code uses the*polyfit*and

*polynomial*methods from

*thorwin.math.Math*, which can be downloaded here.

import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.chart.LineChart; import javafx.scene.chart.NumberAxis; import javafx.scene.chart.XYChart; import javafx.stage.Stage; import static thorwin.math.Math.polyfit; import static thorwin.math.Math.polynomial; public class Demo extends Application { @Override public void start(Stage primaryStage) throws Exception{ // stup the chart XYChart.Series<Number,Number> series1 = new XYChart.Series<>(); XYChart.Series<Number,Number> series2 = new XYChart.Series<>(); NumberAxis xAxis = new NumberAxis(); NumberAxis yAxis = new NumberAxis(); LineChart<Number,Number> chart = new LineChart<Number, Number>(xAxis, yAxis); chart.getData().add(series1); chart.getData().add(series2); chart.getStylesheets().add(Demo.class.getResource("style.css") .toExternalForm()); // setup chart series double[] xs = {0.0, 1.0, 2.0, 3.0, 4.0, 5.0}; double[] ys = {0.5, 1.3, 2.4, 5.6, 8.8, 9.1}; for (int i = 0; i < xs.length; i++) { series1.getData().add(new XYChart.Data<>(xs[i], ys[i])); } // calculate the polynomial coefficients and calculate trend points double[] coefficients = polyfit(xs, ys, 2); for (double x = 0; x <= 5.0; x += 0.05) { double y = polynomial(x, coefficients); series2.getData().add(new XYChart.Data<>(x,y)); } // setup scene and stage Scene scene = new Scene( chart ); primaryStage.setScene(scene); primaryStage.sizeToScene(); primaryStage.show(); } public static void main(String[] args) { launch(Demo.class, args); } }

The

*polyfit*method calculates the polynomial coefficients the the polynomial that fits the sample points best. I've chosen a 2nd order polynomial, which is a curve. If you want a trend line instead of a curve, use a first order polynomial. Higher order polynomials are also possible, just experiment a little.

### Stylesheet

The chart we're creating looks like a combination of a scatter chart and a line chart. We could use two charts and try to combine them into one, but applying some styling to the line chart seems to work as well.The code refers to a file 'style.css', which contains the following stylesheet:

.default-color0.chart-series-line { -fx-stroke: transparent; } .default-color1.chart-line-symbol { -fx-background-color: transparent; }

This stylesheet will hide lines of the sample data (first data series). It also hides the sample points of the trend curve (second data series).

## No comments:

Post a Comment