package
mychartsample;
import
java.util.ArrayList;
import
javafx.application.Application;
import
javafx.collections.FXCollections;
import
javafx.collections.ObservableList;
import
javafx.scene.Scene;
import
javafx.scene.chart.NumberAxis;
import
javafx.scene.chart.XYChart;
import
javafx.scene.chart.XYChart.Series;
import
javafx.stage.Stage;
import
org.apache.commons.math3.stat.regression.OLSMultipleLinearRegression;
import
org.apache.commons.math3.stat.regression.SimpleRegression;
/**
* MyChart1Sample - for sample of MyChart1, customized LineChart
*
* @author bitwalk
*/
public
class
MyChart1Sample
extends
Application {
@Override
public
void
start(Stage stage) {
stage.setTitle(
"MyChart Sample"
);
final
NumberAxis xAxis =
new
NumberAxis();
final
NumberAxis yAxis =
new
NumberAxis();
xAxis.setLabel(
"X軸ラベル(時間)"
);
yAxis.setLabel(
"Y軸ラベル(数値)"
);
final
MyChart1<Number, Number> myChart =
new
MyChart1<>(xAxis, yAxis);
myChart.setTitle(
"最小二乗法のサンプル"
);
myChart.setAnimated(
false
);
myChart.setCreateSymbols(
true
);
myChart.setData(getChartData());
Scene scene =
new
Scene(myChart,
600
,
400
);
scene.getStylesheets().add(getClass().getResource(
"MyChart1.css"
).toExternalForm());
stage.setScene(scene);
stage.show();
}
/**
* getChartData
*
* @return ObservableList<XYChart.Series<String, Double>>
*/
private
ObservableList<XYChart.Series<Number, Number>> getChartData() {
Series<Number, Number> series1 =
new
Series<>();
Series<Number, Number> series2 =
new
Series<>();
Series<Number, Number> series3 =
new
Series<>();
ArrayList<PairData> dataArr =
new
ArrayList<>();
dataArr.add(setPair(1d, 3d));
dataArr.add(setPair(2d, 7d));
dataArr.add(setPair(3d, 14d));
dataArr.add(setPair(4d, 10d));
dataArr.add(setPair(5d, 17d));
ArrayList<Double> xRange =
new
ArrayList<>();
xRange.add(
0.5
);
xRange.add(
5.5
);
SimpleRegression regression =
new
SimpleRegression();
OLSMultipleLinearRegression mulreg =
new
OLSMultipleLinearRegression();
double
[] y_mulreg =
new
double
[dataArr.size()];
double
[][] x_mulreg =
new
double
[dataArr.size()][];
series1.setName(
"観測データ"
);
for
(
int
i =
0
; i < dataArr.size(); i++) {
double
x = dataArr.get(i).X;
double
y = dataArr.get(i).Y;
series1.getData().add(
new
XYChart.Data(x, y));
regression.addData(x, y);
y_mulreg[i] = y;
x_mulreg[i] =
new
double
[]{x, x * x, x * x * x};
}
series2.setName(
"単回帰(直線)"
);
xRange.stream().forEach((xr) -> {
series2.getData().add(
new
XYChart.Data(xr, regression.predict(xr)));
});
series3.setName(
"重回帰(三次式)"
);
mulreg.newSampleData(y_mulreg, x_mulreg);
double
[] beta = mulreg.estimateRegressionParameters();
double
x0 = xRange.get(
0
);
while
(x0 <= xRange.get(
1
)) {
series3.getData().add(
new
XYChart.Data(x0, getPolynomialValue(beta, x0)));
x0 = x0 +
0.01
;
}
ObservableList<XYChart.Series<Number, Number>> seriesList = FXCollections.observableArrayList();
seriesList.addAll(series1, series2, series3);
return
seriesList;
}
/**
* getPolynomialValue
*
* @param coef coefficient
* @param x x value
* @return calculated polynomial
*/
private
double
getPolynomialValue(
double
[] coef,
double
x) {
double
y = 0d;
for
(
int
i =
0
; i < coef.length; i++) {
y = y + coef[i] * Math.pow(x, i);
}
return
y;
}
/**
* setPair - set pair of data to the PairData structure
*
* @param x
* @param y
* @return PairData
*/
private
PairData setPair(
double
x,
double
y) {
PairData data =
new
PairData();
data.X = x;
data.Y = y;
return
data;
}
/**
* PairData - structure for handling (x, y) data
*/
private
class
PairData {
double
X;
double
Y;
}
/**
* @param args the command line arguments
*/
public
static
void
main(String[] args) {
launch(args);
}
}