【问题标题】:How to plot many datapoints efficiently using javafx or other libraries?如何使用 javafx 或其他库有效地绘制许多数据点?
【发布时间】:2019-11-24 05:25:20
【问题描述】:

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

有没有人知道如何更快地构建所需的图表。如有必要,我也会使用其他 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();
    }

}

【问题讨论】:

  • Chart-FX 是新出现的。我跑了一些样本。看起来很有希望。
  • 我试过这个,但不幸的是它并没有好转。

标签: java performance javafx charts


【解决方案1】:

这个问题已经经常被问到这里。与其说是性能问题,不如说是合理使用工具的问题。你知道你的显示器设备有多少像素吗?如果是,那么您可以问自己这个问题,您认为 100.000 个数据点会剩下什么。

解决您的问题的方法是将数据量减少到合理的程度。您还可以尝试通过外部管理在某个时间点显示的数据的数量和部分来虚拟化您的显示器,例如用于滚动,类似于 TableView 的方式。

【讨论】:

    【解决方案2】:

    https://github.com/GSI-CS-CO/chart-fx 专门为此设计的。看看——或者更好——试试这些例子。

    注意我们在内部将其用于与加速器相关的数据采集/显示目的,实时更新 10k 到 1M 数据点有一个公平的基于 Swing 的解决方案 (JDataViewer),但找不到与 JavaFX 兼容的任何等效项......给它试一试...它是免费的...并且对贡献和 cmets 开放。

    【讨论】:

      猜你喜欢
      • 2018-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多