JavaFX のチャートを使いこなせるようになりたいと、いくつかチャートのサンプルを紹介してきました。今回は ScatterChart を利用した散布図のサンプルを紹介します。
動作環境は次の通りです。
- OS: Fedora 22 x86_64
- jdk1.8.0_45-1.8.0_45-fcs.x86_64 (Oracle)
- IDE: NetBeans IDE 8.0.2
今回は [3] を参考にして、マウスのポインタをデータ上に持っていけば Tooltip でデータ点の座標を表示できるようにしました。
リスト:ScatterChartSample.java
package scatterchartsample;
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.ScatterChart;
import javafx.scene.chart.XYChart;
import javafx.scene.chart.XYChart.Series;
import javafx.scene.control.Tooltip;
import javafx.stage.Stage;
public class ScatterChartSample extends Application {
@Override
public void start(Stage stage) {
stage.setTitle("Scatter Chart Sample");
//defining the axes
final NumberAxis xAxis = new NumberAxis();
final NumberAxis yAxis = new NumberAxis();
xAxis.setLabel("X軸ラベル(数値)");
yAxis.setLabel("Y軸ラベル(数値)");
//creating the chart
final ScatterChart scatterChart = new ScatterChart(xAxis, yAxis);
ObservableList<XYChart.Series<Double, Double>> scatterData = getScatterData();
scatterChart.setData(scatterData);
scatterChart.setTitle("散布図のサンプル");
Scene scene = new Scene(scatterChart, 600, 400);
scene.getStylesheets().add(getClass().getResource("ScatterChart.css").toExternalForm());
stage.setScene(scene);
stage.show();
scatterData.stream().forEach((series) -> {
series.getData().stream().forEach((point) -> {
Tooltip.install(point.getNode(),
new Tooltip(String.format("(%3.2f, %3.2f)", point.getXValue(), point.getYValue())));
});
});
}
/**
*
* @return ObservableList<XYChart.Series<Double, Double>>
*/
private ObservableList<XYChart.Series<Double, Double>> getScatterData() {
Series<Double, Double> series1 = new Series<>();
Series<Double, Double> series2 = new Series<>();
series1.setName("系列1");
series2.setName("系列2");
for (int i = 0; i < 50; i++) {
series1.getData().add(new XYChart.Data(Math.random() * 2 - 1.4, Math.random() - .7));
series2.getData().add(new XYChart.Data(Math.random() * 2 - .6, Math.random() - .3));
}
ObservableList<XYChart.Series<Double, Double>> seriesList = FXCollections.observableArrayList();
seriesList.addAll(series1, series2);
return seriesList;
}
public static void main(String[] args) {
launch(args);
}
}
CSS は、今回も折れ線グラフに使ったものをベースにしています。
リスト:ScatterChart.css
.chart {
-fx-padding: 10px;
-fx-background-color: white;
}
.chart-content {
-fx-padding: 10px;
}
.chart-title {
-fx-font-size: 18pt;
}
.chart-legend {
-fx-font-size: 12pt;
-fx-background-color: transparent;
-fx-padding: 10px;
}
.axis-label {
-fx-font-size: 14pt;
}
.axis {
-fx-tick-label-font: 12pt system;
}
.chart-symbol { /* solid circle */
-fx-background-radius: 3px;
-fx-padding: 3px;
}
.default-color0.chart-symbol {
-fx-background-color: black, forestgreen;
}
.default-color1.chart-symbol {
-fx-background-color: tomato;
-fx-background-radius: 0;
-fx-background-insets: 0;
-fx-shape: "M2,0 L5,4 L8,0 L10,0 L10,2 L6,5 L10,8 L10,10 L8,10 L5,6 L2,
10 L0,10 L0,8 L4,5 L0,2 L0,0 Z";
}
実行例を以下に示します。
散布図は自分にとって最も基本的なグラフです。データを表現する際にまず、XY グラフ(散布図)を作ってみて、それからデータを結ぶとか補間するなど、データに視覚的な意味付けをしていきます。ですので、ScatterChart を出発点として、線やら何やら加えていけるととても嬉しいのですが、JavaFX のチャートはそのような仕様にはなっていません。しかし、基本的なチャートが利用できるわけですから、これらのクラスを拡張して自分の好きなチャートを作れるようにすれば良いのです。
さて、言うは易く行うは難し…、習得に時間が掛りそうではあります。
参考サイト
- JavaFX CSS Reference Guide
- Using JavaFX Charts: Styling Charts with CSS | JavaFX 2 Tutorials and Documentation
- Tooltips for datapoints in a scatter chart in javafx 2.2 - Stack Overflow



0 件のコメント:
コメントを投稿