原文: http://zetcode.com/gui/javafx/charts/

在 JavaFX 教程的这一部分中,我们将使用图表。 在 JavaFX 中,只需添加几行代码即可构建图表。

在以下示例中,我们创建一个折线图,一个面积图,一个散点图,一个条形图和一个饼图。

折线图

折线图是一种基本类型的图表,它将信息显示为由直线段连接的一系列数据点。 JavaFX 中的折线图是使用javafx.scene.chart.LineChart创建的。

LineChartEx.java

  1. package com.zetcode;
  2. import javafx.application.Application;
  3. import javafx.scene.Scene;
  4. import javafx.scene.chart.LineChart;
  5. import javafx.scene.chart.NumberAxis;
  6. import javafx.scene.chart.XYChart;
  7. import javafx.scene.layout.HBox;
  8. import javafx.stage.Stage;
  9. /*
  10. * ZetCode JavaFX tutorial
  11. *
  12. * This program creates a line chart.
  13. *
  14. * Author: Jan Bodnar
  15. * Website: zetcode.com
  16. * Last modified: August 2016
  17. */
  18. public class LineChartEx extends Application {
  19. @Override
  20. public void start(Stage stage) {
  21. initUI(stage);
  22. }
  23. private void initUI(Stage stage) {
  24. HBox root = new HBox();
  25. Scene scene = new Scene(root, 450, 330);
  26. NumberAxis xAxis = new NumberAxis();
  27. xAxis.setLabel("Age");
  28. NumberAxis yAxis = new NumberAxis();
  29. yAxis.setLabel("Salary (€)");
  30. LineChart lineChart = new LineChart(xAxis, yAxis);
  31. lineChart.setTitle("Average salary per age");
  32. XYChart.Series data = new XYChart.Series();
  33. data.setName("2016");
  34. data.getData().add(new XYChart.Data(18, 567));
  35. data.getData().add(new XYChart.Data(20, 612));
  36. data.getData().add(new XYChart.Data(25, 800));
  37. data.getData().add(new XYChart.Data(30, 980));
  38. data.getData().add(new XYChart.Data(40, 1410));
  39. data.getData().add(new XYChart.Data(50, 2350));
  40. lineChart.getData().add(data);
  41. root.getChildren().add(lineChart);
  42. stage.setTitle("LineChart");
  43. stage.setScene(scene);
  44. stage.show();
  45. }
  46. public static void main(String[] args) {
  47. launch(args);
  48. }
  49. }

在示例中,我们有一个折线图,显示每个年龄段的平均工资。

  1. NumberAxis xAxis = new NumberAxis();
  2. xAxis.setLabel("Age");
  3. NumberAxis yAxis = new NumberAxis();
  4. yAxis.setLabel("Salary (€)");

NumberAxis创建两个轴。 setLabel()方法设置轴的描述。

  1. LineChart lineChart = new LineChart(xAxis, yAxis);
  2. lineChart.setTitle("Average salary per age");

LineChart创建折线图。 setTitle()方法为图表设置标题。

  1. XYChart.Series data = new XYChart.Series();
  2. data.setName("2016");

XYChart.Series为图表提供数据系列。 数据系列是数据点的列表。 每个数据点包含一个 x 值和一个 y 值。 setName()方法为系列命名。 (一个图表中可能有多个系列。)

  1. data.getData().add(new XYChart.Data(18, 567));
  2. data.getData().add(new XYChart.Data(20, 612));
  3. data.getData().add(new XYChart.Data(25, 800));
  4. data.getData().add(new XYChart.Data(30, 980));
  5. data.getData().add(new XYChart.Data(40, 1410));
  6. data.getData().add(new XYChart.Data(50, 2350));

我们将数据添加到数据系列中。 XYChart.Data是一个单独的数据项,其中包含 2 个轴图的数据。

  1. lineChart.getData().add(data);

数据被插入到图表中。

JavaFX 图表 - 图1

图:LineChart

区域图

区域图以图形方式显示随时间变化的定量数据。

AreaChart.java

  1. package com.zetcode;
  2. import javafx.application.Application;
  3. import javafx.scene.Scene;
  4. import javafx.scene.chart.AreaChart;
  5. import javafx.scene.chart.CategoryAxis;
  6. import javafx.scene.chart.NumberAxis;
  7. import javafx.scene.chart.XYChart;
  8. import javafx.scene.layout.HBox;
  9. import javafx.stage.Stage;
  10. /*
  11. * ZetCode JavaFX tutorial
  12. *
  13. * This program creates an area chart.
  14. *
  15. * Author: Jan Bodnar
  16. * Website: zetcode.com
  17. * Last modified: August 2016
  18. */
  19. public class AreaChartEx extends Application {
  20. @Override
  21. public void start(Stage stage) {
  22. initUI(stage);
  23. }
  24. private void initUI(Stage stage) {
  25. HBox root = new HBox();
  26. Scene scene = new Scene(root, 490, 350);
  27. CategoryAxis xAxis = new CategoryAxis();
  28. xAxis.setLabel("Time");
  29. NumberAxis yAxis = new NumberAxis();
  30. yAxis.setLabel("Thousand bbl/d");
  31. AreaChart areaChart = new AreaChart(xAxis, yAxis);
  32. areaChart.setTitle("Oil consumption");
  33. XYChart.Series data = new XYChart.Series();
  34. data.getData().add(new XYChart.Data("2004", 82502));
  35. data.getData().add(new XYChart.Data("2005", 84026));
  36. data.getData().add(new XYChart.Data("2006", 85007));
  37. data.getData().add(new XYChart.Data("2007", 86216));
  38. data.getData().add(new XYChart.Data("2008", 85559));
  39. data.getData().add(new XYChart.Data("2009", 84491));
  40. data.getData().add(new XYChart.Data("2010", 87672));
  41. data.getData().add(new XYChart.Data("2011", 88575));
  42. data.getData().add(new XYChart.Data("2012", 89837));
  43. data.getData().add(new XYChart.Data("2013", 90701));
  44. areaChart.getData().add(data);
  45. areaChart.setLegendVisible(false);
  46. root.getChildren().add(areaChart);
  47. stage.setTitle("AreaChart");
  48. stage.setScene(scene);
  49. stage.show();
  50. }
  51. public static void main(String[] args) {
  52. launch(args);
  53. }
  54. }

该示例显示了一个区域图,该区域图按年份显示了世界原油消耗量。

  1. AreaChart areaChart = new AreaChart(xAxis, yAxis);
  2. areaChart.setTitle("Oil consumption");

使用AreaChart创建面积图。

  1. CategoryAxis xAxis = new CategoryAxis();
  2. xAxis.setLabel("Time");

CategoryAxis适用于字符串类别。 我们在此轴上显示年份字符串。

JavaFX 图表 - 图2

图:AreaChart

散点图

散点图是在水平和垂直轴上绘制的一组点。

ScatterChartEx.java

  1. package com.zetcode;
  2. import javafx.application.Application;
  3. import javafx.scene.Scene;
  4. import javafx.scene.chart.CategoryAxis;
  5. import javafx.scene.chart.NumberAxis;
  6. import javafx.scene.chart.ScatterChart;
  7. import javafx.scene.chart.XYChart;
  8. import javafx.scene.layout.HBox;
  9. import javafx.stage.Stage;
  10. /*
  11. * ZetCode JavaFX tutorial
  12. *
  13. * This program creates a scatter chart.
  14. *
  15. * Author: Jan Bodnar
  16. * Website: zetcode.com
  17. * Last modified: August 2016
  18. */
  19. public class ScatterChartEx extends Application {
  20. @Override
  21. public void start(Stage stage) {
  22. initUI(stage);
  23. }
  24. private void initUI(Stage stage) {
  25. HBox root = new HBox();
  26. CategoryAxis xAxis = new CategoryAxis();
  27. NumberAxis yAxis = new NumberAxis("USD/kg", 30, 50, 2);
  28. ScatterChart scatterChart = new ScatterChart(xAxis, yAxis);
  29. XYChart.Series data = new XYChart.Series();
  30. data.getData().add(new XYChart.Data("Mar 14", 43));
  31. data.getData().add(new XYChart.Data("Nov 14", 38.5));
  32. data.getData().add(new XYChart.Data("Jan 15", 41.8));
  33. data.getData().add(new XYChart.Data("Mar 15", 37));
  34. data.getData().add(new XYChart.Data("Dec 15", 33.7));
  35. data.getData().add(new XYChart.Data("Feb 16", 39.8));
  36. scatterChart.getData().add(data);
  37. scatterChart.setLegendVisible(false);
  38. Scene scene = new Scene(root, 450, 330);
  39. root.getChildren().add(scatterChart);
  40. stage.setTitle("Gold price");
  41. stage.setScene(scene);
  42. stage.show();
  43. }
  44. public static void main(String[] args) {
  45. launch(args);
  46. }
  47. }

在示例中,我们使用ScatterChart显示黄金价格。

  1. CategoryAxis xAxis = new CategoryAxis();

x 轴是用于显示日期的CategoryAxis

  1. NumberAxis yAxis = new NumberAxis("USD/kg", 30, 50, 2);

y 轴是用于显示黄金价格的NumberAxis。 构造器的参数为:轴标签,下限,上限和刻度单位。

  1. XYChart.Series data = new XYChart.Series();
  2. data.getData().add(new XYChart.Data("Mar 14", 43));
  3. ...

使用XYChart.Series创建一系列数据,并使用XYChart.Data创建其数据项。

JavaFX 图表 - 图3

图:ScatterChart

条形图

条形图显示带有矩形条的分组数据,其长度与它们所代表的值成比例。 条形图可以垂直或水平绘制。

BarChartEx.java

  1. package com.zetcode;
  2. import javafx.application.Application;
  3. import javafx.scene.Scene;
  4. import javafx.scene.chart.BarChart;
  5. import javafx.scene.chart.CategoryAxis;
  6. import javafx.scene.chart.NumberAxis;
  7. import javafx.scene.chart.XYChart;
  8. import javafx.scene.layout.HBox;
  9. import javafx.stage.Stage;
  10. /*
  11. * ZetCode JavaFX tutorial
  12. *
  13. * This program creates a bar chart.
  14. *
  15. * Author: Jan Bodnar
  16. * Website: zetcode.com
  17. * Last modified: August 2016
  18. */
  19. public class BarChartEx extends Application {
  20. @Override
  21. public void start(Stage stage) {
  22. initUI(stage);
  23. }
  24. private void initUI(Stage stage) {
  25. HBox root = new HBox();
  26. Scene scene = new Scene(root, 480, 330);
  27. CategoryAxis xAxis = new CategoryAxis();
  28. NumberAxis yAxis = new NumberAxis();
  29. yAxis.setLabel("Gold medals");
  30. BarChart barChart = new BarChart(xAxis, yAxis);
  31. barChart.setTitle("Olympic gold medals in London");
  32. XYChart.Series data = new XYChart.Series();
  33. data.getData().add(new XYChart.Data("USA", 46));
  34. data.getData().add(new XYChart.Data("China", 38));
  35. data.getData().add(new XYChart.Data("UK", 29));
  36. data.getData().add(new XYChart.Data("Russia", 22));
  37. data.getData().add(new XYChart.Data("South Korea", 13));
  38. data.getData().add(new XYChart.Data("Germany", 11));
  39. barChart.getData().add(data);
  40. barChart.setLegendVisible(false);
  41. root.getChildren().add(barChart);
  42. stage.setTitle("BarChart");
  43. stage.setScene(scene);
  44. stage.show();
  45. }
  46. public static void main(String[] args) {
  47. launch(args);
  48. }
  49. }

在示例中,我们使用条形图显示了 2012 年伦敦奥运会每个国家/地区的奥运金牌数量。

  1. BarChart barChart = new BarChart(xAxis, yAxis);

使用BarChart创建条形图。

JavaFX 图表 - 图4

图:AreaChart

饼形图

饼图是一种圆图,分为多个切片以说明数值比例。

PieChartEx.java

  1. package com.zetcode;
  2. import javafx.application.Application;
  3. import javafx.collections.FXCollections;
  4. import javafx.collections.ObservableList;
  5. import javafx.scene.Scene;
  6. import javafx.scene.chart.PieChart;
  7. import javafx.scene.layout.HBox;
  8. import javafx.stage.Stage;
  9. /*
  10. * ZetCode JavaFX tutorial
  11. *
  12. * This program creates a pie chart.
  13. *
  14. * Author: Jan Bodnar
  15. * Website: zetcode.com
  16. * Last modified: August 2016
  17. */
  18. public class PieChartEx extends Application {
  19. @Override
  20. public void start(Stage stage) {
  21. initUI(stage);
  22. }
  23. private void initUI(Stage stage) {
  24. HBox root = new HBox();
  25. Scene scene = new Scene(root, 450, 330);
  26. ObservableList<PieChart.Data> pieChartData
  27. = FXCollections.observableArrayList(
  28. new PieChart.Data("Apache", 52),
  29. new PieChart.Data("Nginx", 31),
  30. new PieChart.Data("IIS", 12),
  31. new PieChart.Data("LiteSpeed", 2),
  32. new PieChart.Data("Google server", 1),
  33. new PieChart.Data("Others", 2));
  34. PieChart pieChart = new PieChart(pieChartData);
  35. pieChart.setTitle("Web servers market share (2016)");
  36. root.getChildren().add(pieChart);
  37. stage.setTitle("PieChart");
  38. stage.setScene(scene);
  39. stage.show();
  40. }
  41. public static void main(String[] args) {
  42. launch(args);
  43. }
  44. }

该示例使用饼图来显示 Web 服务器的市场份额。

  1. ObservableList<PieChart.Data> pieChartData
  2. = FXCollections.observableArrayList(
  3. new PieChart.Data("Apache", 52),
  4. new PieChart.Data("Nginx", 31),
  5. new PieChart.Data("IIS", 12),
  6. new PieChart.Data("LiteSpeed", 2),
  7. new PieChart.Data("Google server", 1),
  8. new PieChart.Data("Others", 2));

饼图数据项是使用PieChart.Data创建的。

  1. PieChart pieChart = new PieChart(pieChartData);

使用PieChart类创建一个饼图。

JavaFX 图表 - 图5

图:PieChart

在本章中,我们在 JavaFX 中创建了LineChartAreaChartScatterChartBarChartPieChartJFreechart 教程显示了如何在流行的 JFreechart 库中创建图表。