如何使用javafx或其他库有效地绘制许多数据点?

时间:2019-07-15 13:35:21

标签: java performance javafx charts

我有4个系列想在一个折线图中绘制。每个系列都有大约100.000个数据点。现在,使用javafx线图,构建图表需要花费几秒钟。不仅速度很慢,而且还占用大量内存。

有人知道如何更快地构建所需的图表。如有必要,我也会使用其他Java库。

这是一些工作代码。对于numDataPoints = 10000,它可以正常运行,但是对于numDataPoints = 70000,它非常慢甚至崩溃。

谢谢。

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.layout.StackPane;
import javafx.stage.Stage;

public class Chart extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage stage) throws Exception {
        prepareStage(stage);

    }

    private void prepareStage(Stage stage) {
        stage.setTitle("JavaFX Chart Demo");
        StackPane pane = new StackPane();



        NumberAxis xAxis = new NumberAxis();
        NumberAxis yAxis = new NumberAxis();
        ScatterChart ac = new ScatterChart(xAxis, yAxis);
        ac.setTitle("Segregation");
        ac.setAnimated(false);
        ac.setHorizontalGridLinesVisible(false);
        ac.setVerticalGridLinesVisible(false);


        int numDataPoints = 70000;

        for (int k=0; k<4; k++) {
            ObservableList<XYChart.Data<Number, Number>> data = FXCollections.<XYChart.Data<Number, Number>>observableArrayList();
            for (int i = 0; i < numDataPoints; i++)
                data.add(new XYChart.Data<>(i,Math.random() ));
            XYChart.Series series = new XYChart.Series(data);
            ac.getData().add(series);
        }


        pane.getChildren().add(ac);
        Scene scene = new Scene(pane, 400, 200);
        scene.getStylesheets().add("chart.css");
        stage.setScene(scene);
        stage.show();
    }

}

2 个答案:

答案 0 :(得分:0)

这个问题在这里已经被问过很多次了。这不仅仅是性能问题,而是合理使用工具的问题。您知道显示器设备连续有多少个像素吗?如果是,那么您可以问自己一个问题,从您的100.000个数据点来看,您认为会保留什么。

您的问题的解决方案是将数据量减少到合理的水平。您还可以尝试通过外部管理在特定时间点显示的数据量和部分数据来虚拟化显示内容。进行滚动操作,其方式类似于TableView。

答案 1 :(得分:0)

https://github.com/GSI-CS-CO/chart-fx 考虑到这一点而专门设计。看一看-或做得更好-试试这些例子。

我们在内部将其用于加速器相关的数据获取/显示目的,实时更新了10k至1M数据点,这是一个基于Swing的公平解决方案(JDataViewer),但找不到与JavaFX兼容的等效项...给它尝试...它是免费的...并开放供稿和评论。