如何在javafx中绘制峰值贴图

如何在javafx中绘制峰值贴图,javafx,javafx-2,javafx-8,Javafx,Javafx 2,Javafx 8,我想在javafx中绘制一个峰值图,但是没有一个类来完成我的目标。所以我修改了“线形图”作为我的“峰值图”,看起来。但我想将X轴移动到0比例(y轴),我能做些什么来实现它 顺便说一下,如果你有更好的方法来实现“峰图”,请给我一些建议 谢谢 public void start(Stage stage) { stage.setTitle("Line Chart Sample"); final NumberAxis xAxis = new NumberAxis();

我想在javafx中绘制一个峰值图,但是没有一个类来完成我的目标。所以我修改了“线形图”作为我的“峰值图”,看起来。但我想将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();
    }
公共作废开始(阶段){
阶段。设置标题(“折线图样本”);
最终数字axis xAxis=新数字axis();
最终数字axis yAxis=新数字axis();
xAxis.setLabel(“X”);
yAxis.setLabel(“Y”);
最终线形图线形图=新线形图(xAxis,yAxis);
线形图。设置标题(“峰值地图”);
XYChart.Series系列1=新的XYChart.Series();
系列1.集合名称(“组合1”);
series1.getData().add(新的XYChart.Data(1,0));
series1.getData().add(新的XYChart.Data(1,14));
XYChart.Series系列2=新的XYChart.Series();
系列2.集合名称(“组合2”);
series2.getData().add(新的XYChart.Data(2,0));
series2.getData().add(新的XYChart.Data(2,34));
XYChart.Series系列3=新的XYChart.Series();
系列3.集合名称(“组合3”);
series3.getData().add(新的XYChart.Data(3,0));
series3.getData().add(新的XYChart.Data(3,35));
XYChart.Series系列4=新的XYChart.Series();
序列4.集合名(“第4组”);
series4.getData().add(新的XYChart.Data(2,0));
series4.getData().add(新的XYChart.Data(2,-8));
场景=新场景(线条图,800600);
lineChart.getData().addAll(系列1、系列2、系列3、系列4);
lineChart.setCreateSynumbles(false);
线形图。setLegendVisible(假);
舞台场景;
stage.show();
}

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

警告:这真是一个棘手的解决方案

找到零水平线对象并将
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()));
                });
            }
        }
    }
最终线形图线形图=新线形图(xAxis,yAxis);
最终ObservableList lineChildren=lineChart.getChildrenUnmodifiable();
最终可选chartContent=lineChildren
.stream()
.filter(节点->节点.getStyleClass().contains(“图表内容”))
.findFirst();
if(chartContent.isPresent()){
最终可选xyChart=((父)chartContent.get())
.getChildrenUnmodifiable()
.stream()
.filter(节点->节点.getStyleClass().isEmpty())
.findFirst();
if(xyChart.isPresent()){
最终可选XaxiOrigin=((父)xyChart.get())
.getChildrenUnmodifiable()
.stream()
.filter(节点->节点.getStyleClass()包含(“图表水平零线”))
.findFirst();
if(xAxisOrigin.isPresent()){
最后一行节点=(行)xAxisOrigin.get();
Platform.runLater(()->{
setTranslateY(-(xAxis.getLayoutY()-node.getEndY());
});
}
}
}
至于我,X和Y标签可能会被删除


注意:我们需要处理窗口大小事件以动态移动
xAxis

什么是峰值映射?你有解释它的链接吗?很抱歉,我不能给你一个确切的定义,因为它更像一个自定义图。但是看起来像。在图中,每个点(x1,y1)确定从(x1,0)到(x1,y1)的直线