如何为JavaFX xy图表的绘制区域着色?

所有XY图表都有一个名为layoutPlotChildren()的抽象方法。为XY图表的绘制区域(区域)着色的一种方法是覆盖此方法。通常,它被称为更新和布局子图。

在此方法的主体中-

  • 获取系列数据。

  • 提取绘制的点。

  • 使用提取的点在绘图区域中绘制多边形。

  • 将所需的颜色设置为多边形。

示例

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.stage.Stage;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.chart.XYChart.Series;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Polygon;
public class EnhancingGraphPlot extends Application {
   public void start(Stage stage) {
      //定义x轴
      NumberAxis xAxis = new NumberAxis(1960, 2020, 10);
      xAxis.setLabel("Years");
      //定义y轴
      NumberAxis yAxis = new NumberAxis (0, 350, 50);
      yAxis.setLabel("No.of schools");
      //准备XY图表的数据
      XYChart.Series<Number,Number> series = new XYChart.Series<Number,Number>();
      series.setName("No of schools in an year");
      series.getData().add(new XYChart.Data<Number,Number>(1970, 15));
      series.getData().add(new XYChart.Data<Number,Number>(1980, 30));
      series.getData().add(new XYChart.Data<Number,Number>(1990, 60));
      series.getData().add(new XYChart.Data<Number,Number>(2000, 120));
      series.getData().add(new XYChart.Data<Number,Number>(2013, 240));
      series.getData().add(new XYChart.Data<Number,Number>(2014, 300));
      //创建数据
      ObservableList<Series<Number, Number>> data =
      FXCollections.observableArrayList(series);
      //创建折线图
      LineChart<Number,Number> lineChart = new LineChart<Number,Number>(xAxis, yAxis, data ) {
         //覆盖layoutPlotChildren方法
         protected void layoutPlotChildren() {
            super.layoutPlotChildren();
            Series<Number,Number> series = (Series<Number,Number>)
            getData().get(0);
            ObservableList<Data<Number,Number>> listOfData = series.getData();
            for(int i = 0; i < listOfData.size()-1; i++) {
               double x1 = getXAxis().getDisplayPosition(listOfData.get(i).getXValue());
               double y1 = getYAxis().getDisplayPosition(0);
               double x2 = getXAxis().getDisplayPosition(listOfData.get((i + 1)).getXValue());
               double y2 = getYAxis().getDisplayPosition(0);
               Polygon polygon = new Polygon();
               polygon.getPoints().addAll(new Double[]{
                  x1,y1, x1, getYAxis().getDisplayPosition(listOfData.get(i).getYValue()), x2,getYAxis().getDisplayPosition(listOfData.get((i+1)).getYValue()), x2,y2
               });
               getPlotChildren().add(polygon);
               polygon.toFront();
               polygon.setFill(Color.DIMGRAY);
            }
         }
      };
      //将折线图添加到堆栈窗格
      StackPane pane = new StackPane(lineChart);
      //设置场景
      Scene scene = new Scene(pane, 595, 300);
      stage.setTitle("Line Chart");
      stage.setScene(scene);
      stage.show();
   }
   public static void main(String args[]){
      launch(args);
   }
}

输出结果