【问题标题】:how to paint peak map in javafx如何在javafx中绘制峰值图
【发布时间】:2017-07-25 02:57:51
【问题描述】:

我想在 javafx 中绘制一个峰值图,但是没有一个类可以完成我的目标。所以我将“LineChart”修改为我的“峰值图”,它看起来that。但是我想将X轴移动到0刻度(y轴),我该怎么做才能实现它。

顺便说一句,如果你有更好的方法来实现“峰图”,请给我一些建议。

谢谢!

public void start(Stage stage) {
        stage.setTitle("Line Chart Sample");
        final NumberAxis xAxis = new NumberAxis();
        final NumberAxis yAxis = new NumberAxis();
        xAxis.setLabel("X");
        yAxis.setLabel("Y");
        final LineChart<Number, Number> lineChart = new LineChart<>(xAxis, yAxis);

        lineChart.setTitle("Peak Map");

        XYChart.Series<Number, Number> series1 = new XYChart.Series<>();
        series1.setName("Portfolio 1");

        series1.getData().add(new XYChart.Data<Number, Number>(1, 0));
        series1.getData().add(new XYChart.Data<Number, Number>(1, 14));

        XYChart.Series<Number, Number> series2 = new XYChart.Series<>();
        series2.setName("Portfolio 2");
        series2.getData().add(new XYChart.Data<Number, Number>(2, 0));
        series2.getData().add(new XYChart.Data<Number, Number>(2, 34));

        XYChart.Series<Number, Number> series3 = new XYChart.Series<>();
        series3.setName("Portfolio 3");
        series3.getData().add(new XYChart.Data<Number, Number>(3, 0));
        series3.getData().add(new XYChart.Data<Number, Number>(3, 35));

        XYChart.Series<Number, Number> series4 = new XYChart.Series<>();
        series4.setName("Protfolio 4");
        series4.getData().add(new XYChart.Data<>(2, 0));
        series4.getData().add(new XYChart.Data<>(2, -8));

        Scene scene = new Scene(lineChart, 800, 600);
        lineChart.getData().addAll(series1, series2, series3, series4);

        lineChart.setCreateSymbols(false);
        lineChart.setLegendVisible(false);

        stage.setScene(scene);
        stage.show();
    }

【问题讨论】:

  • 什么是峰值图?你有链接到解释它的东西吗?
  • 很抱歉我不能给你一个确切的定义,因为它更像是一个自定义图表。但它看起来像https://i.stack.imgur.com/cmvys.png。在图中,像(x1, y1)这样的每个点决定了从(x1, 0)到(x1, y1)的一条直线

标签: javafx javafx-2 javafx-8


【解决方案1】:

我玩了一下你的代码。你期待这样的结果吗?

警告:这是一个非常棘手的解决方案。

找到一个零水平线对象并将xAxis移动到这个位置:

    final LineChart<Number, Number> lineChart = new LineChart<>(xAxis, yAxis);

    final ObservableList<Node> lineChildren = lineChart.getChildrenUnmodifiable();
    final Optional<Node> chartContent = lineChildren
            .stream()
            .filter(node -> node.getStyleClass().contains("chart-content"))
            .findFirst();

    if (chartContent.isPresent()) {
        final Optional<Node> xyChart = ((Parent)chartContent.get())
                .getChildrenUnmodifiable()
                .stream()
                .filter(node -> node.getStyleClass().isEmpty())
                .findFirst();

        if (xyChart.isPresent()) {
            final Optional<Node> xAxisOrigin = ((Parent) xyChart.get())
                    .getChildrenUnmodifiable()
                    .stream()
                    .filter(node -> node.getStyleClass().contains("chart-horizontal-zero-line"))
                    .findFirst();

            if (xAxisOrigin.isPresent()) {
                final Line node = (Line) xAxisOrigin.get();
                Platform.runLater(() -> {
                    xAxis.setTranslateY(-(xAxis.getLayoutY() - node.getEndY()));
                });
            }
        }
    }

对我来说,X 和 Y 标签可能会被完全删除。

注意:我们需要处理窗口调整事件来动态移动xAxis

【讨论】:

    猜你喜欢
    • 2017-11-14
    • 2017-06-09
    • 2013-11-14
    • 2020-11-27
    • 2013-06-23
    • 2015-11-01
    • 2019-05-04
    • 2013-08-18
    • 2016-05-28
    相关资源
    最近更新 更多