JavaFX 图表
最后修改于 2023 年 10 月 18 日
在本 JavaFX 教程中,我们将使用图表。 在 JavaFX 中,只需添加几行代码即可构建图表。
在下面的示例中,我们创建一个折线图、一个面积图、一个散点图、一个柱状图和一个饼图。
JavaFX 折线图
折线图是一种基本类型的图表,它将信息显示为由直线段连接的一系列数据点。 JavaFX 中的折线图使用 javafx.scene.chart.LineChart 创建。
package com.zetcode;
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.scene.layout.HBox;
import javafx.stage.Stage;
public class LineChartEx extends Application {
@Override
public void start(Stage stage) {
initUI(stage);
}
private void initUI(Stage stage) {
var root = new HBox();
var scene = new Scene(root, 450, 330);
var xAxis = new NumberAxis();
xAxis.setLabel("Age");
var yAxis = new NumberAxis();
yAxis.setLabel("Salary (€)");
var lineChart = new LineChart<>(xAxis, yAxis);
lineChart.setTitle("Average salary per age");
var data = new XYChart.Series<Number, Number>();
data.setName("2016");
data.getData().add(new XYChart.Data<>(18, 567));
data.getData().add(new XYChart.Data<>(20, 612));
data.getData().add(new XYChart.Data<>(25, 800));
data.getData().add(new XYChart.Data<>(30, 980));
data.getData().add(new XYChart.Data<>(40, 1410));
data.getData().add(new XYChart.Data<>(50, 2350));
lineChart.getData().add(data);
root.getChildren().add(lineChart);
stage.setTitle("LineChart");
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
在这个例子中,我们有一个显示每一年龄段平均工资的折线图。
var xAxis = new NumberAxis();
xAxis.setLabel("Age");
var yAxis = new NumberAxis();
yAxis.setLabel("Salary (€)");
使用 NumberAxis 创建两个轴。 setLabel 方法为轴设置描述。
var lineChart = new LineChart<>(xAxis, yAxis);
lineChart.setTitle("Average salary per age");
LineChart 创建一个折线图。 setTitle 方法为图表设置标题。
var data = new XYChart.Series<Number, Number>();
data.setName("2016");
XYChart.Series 为图表提供数据系列。 数据系列是数据点列表。 每个数据点包含一个 x 值和一个 y 值。 setName 方法给一个系列命名。(一个图表中可能有多个系列。)
data.getData().add(new XYChart.Data<>(18, 567)); data.getData().add(new XYChart.Data<>(20, 612)); ...
我们将数据添加到数据系列中。 XYChart.Data 是一个包含 2 轴图表数据的单个数据项。
lineChart.getData().add(data);
数据被插入到图表中。
JavaFX 面积图
面积图以图形方式显示随时间变化的数据。
package com.zetcode;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.chart.AreaChart;
import javafx.scene.chart.CategoryAxis;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;
public class AreaChartEx extends Application {
@Override
public void start(Stage stage) {
initUI(stage);
}
private void initUI(Stage stage) {
var root = new HBox();
var scene = new Scene(root, 490, 350);
var xAxis = new CategoryAxis();
xAxis.setLabel("Time");
var yAxis = new NumberAxis();
yAxis.setLabel("Thousand bbl/d");
var areaChart = new AreaChart<>(xAxis, yAxis);
areaChart.setTitle("Oil consumption");
var data = new XYChart.Series<String, Number>();
data.getData().add(new XYChart.Data<>("2004", 82502));
data.getData().add(new XYChart.Data<>("2005", 84026));
data.getData().add(new XYChart.Data<>("2006", 85007));
data.getData().add(new XYChart.Data<>("2007", 86216));
data.getData().add(new XYChart.Data<>("2008", 85559));
data.getData().add(new XYChart.Data<>("2009", 84491));
data.getData().add(new XYChart.Data<>("2010", 87672));
data.getData().add(new XYChart.Data<>("2011", 88575));
data.getData().add(new XYChart.Data<>("2012", 89837));
data.getData().add(new XYChart.Data<>("2013", 90701));
areaChart.getData().add(data);
areaChart.setLegendVisible(false);
root.getChildren().add(areaChart);
stage.setTitle("AreaChart");
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
本例展示了一个显示世界原油年消耗量的面积图。
var areaChart = new AreaChart<>(xAxis, yAxis);
areaChart.setTitle("Oil consumption");
使用 AreaChart 创建一个面积图。
var xAxis = new CategoryAxis();
xAxis.setLabel("Time");
CategoryAxis 适用于字符串类别。 我们在这个轴上显示年份字符串。
JavaFX 散点图
散点图是在水平轴和垂直轴上绘制的一组点。
package com.zetcode;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.chart.CategoryAxis;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.ScatterChart;
import javafx.scene.chart.XYChart;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;
public class ScatterChartEx extends Application {
@Override
public void start(Stage stage) {
initUI(stage);
}
private void initUI(Stage stage) {
var root = new HBox();
var xAxis = new CategoryAxis();
var yAxis = new NumberAxis("USD/kg", 30, 50, 2);
var scatterChart = new ScatterChart<>(xAxis, yAxis);
var data = new XYChart.Series<String, Number>();
data.getData().add(new XYChart.Data<>("Mar 14", 43));
data.getData().add(new XYChart.Data<>("Nov 14", 38.5));
data.getData().add(new XYChart.Data<>("Jan 15", 41.8));
data.getData().add(new XYChart.Data<>("Mar 15", 37));
data.getData().add(new XYChart.Data<>("Dec 15", 33.7));
data.getData().add(new XYChart.Data<>("Feb 16", 39.8));
scatterChart.getData().add(data);
scatterChart.setLegendVisible(false);
var scene = new Scene(root, 450, 330);
root.getChildren().add(scatterChart);
stage.setTitle("Gold price");
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
在本例中,我们使用 ScatterChart 来显示金价。
var xAxis = new CategoryAxis();
x 轴是 CategoryAxis,用于显示日期。
var yAxis = new NumberAxis("USD/kg", 30, 50, 2);
y 轴是 NumberAxis,用于显示金价。 构造函数的参数是:轴标签、下限、上限和刻度单位。
var data = new XYChart.Series<String, Number>();
data.getData().add(new XYChart.Data<>("Mar 14", 43));
...
使用 XYChart.Series 创建一系列数据,并使用 XYChart.Data 创建其数据项。
JavaFX 柱状图
条形图使用矩形条呈现分组数据,条的长度与它们表示的值成比例。 这些条可以垂直或水平绘制。
package com.zetcode;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.chart.BarChart;
import javafx.scene.chart.CategoryAxis;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;
public class BarChartEx extends Application {
@Override
public void start(Stage stage) {
initUI(stage);
}
private void initUI(Stage stage) {
var root = new HBox();
var scene = new Scene(root, 480, 330);
var xAxis = new CategoryAxis();
var yAxis = new NumberAxis();
yAxis.setLabel("Gold medals");
var barChart = new BarChart<>(xAxis, yAxis);
barChart.setTitle("Olympic gold medals in London");
var data = new XYChart.Series<String, Number>();
data.getData().add(new XYChart.Data<>("USA", 46));
data.getData().add(new XYChart.Data<>("China", 38));
data.getData().add(new XYChart.Data<>("UK", 29));
data.getData().add(new XYChart.Data<>("Russia", 22));
data.getData().add(new XYChart.Data<>("South Korea", 13));
data.getData().add(new XYChart.Data<>("Germany", 11));
barChart.getData().add(data);
barChart.setLegendVisible(false);
root.getChildren().add(barChart);
stage.setTitle("BarChart");
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
在本例中,我们使用柱状图来显示 2012 年伦敦奥运会上每个国家的奥运金牌数量。
var barChart = new BarChart(xAxis, yAxis);
使用 BarChart 创建一个柱状图。
JavaFX 饼图
饼图是一个圆形图表,被分成切片以说明数值比例。
package com.zetcode;
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.chart.PieChart;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;
public class PieChartEx extends Application {
@Override
public void start(Stage stage) {
initUI(stage);
}
private void initUI(Stage stage) {
var root = new HBox();
var scene = new Scene(root, 450, 330);
ObservableList<PieChart.Data> pieChartData
= FXCollections.observableArrayList(
new PieChart.Data("Apache", 52),
new PieChart.Data("Nginx", 31),
new PieChart.Data("IIS", 12),
new PieChart.Data("LiteSpeed", 2),
new PieChart.Data("Google server", 1),
new PieChart.Data("Others", 2));
var pieChart = new PieChart(pieChartData);
pieChart.setTitle("Web servers market share (2016)");
root.getChildren().add(pieChart);
stage.setTitle("PieChart");
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
本例使用饼图来显示 Web 服务器的市场份额。
ObservableList<PieChart.Data> pieChartData
= FXCollections.observableArrayList(
new PieChart.Data("Apache", 52),
new PieChart.Data("Nginx", 31),
new PieChart.Data("IIS", 12),
new PieChart.Data("LiteSpeed", 2),
new PieChart.Data("Google server", 1),
new PieChart.Data("Others", 2));
饼图数据项使用 PieChart.Data 创建。
var pieChart = new PieChart(pieChartData);
使用 PieChart 类创建一个饼图。
在本章中,我们创建了一个 LineChart、一个 AreaChart、一个 ScatterChart、一个 BarChart 和一个 PieChart。 JFreechart 教程 展示了如何在流行的 JFreechart 库中创建图表。