gpt4 book ai didi

javafx - LineChart FX - 删除实线

转载 作者:行者123 更新时间:2023-12-02 08:06:15 26 4
gpt4 key购买 nike

我有一个关于图表 LineChart JavaFX 的好奇问题。

我有这个图表: Grapg在 X 轴上形成“跳跃”的点(如我得分的两个红点所示),因此 JavaFX 在这两点之间画了一条线。如何删除每个“跳转”之间的那条线?

我发布代码:

public class ControllerIndividua {

public static void plotIndividuaFull(String path, Stage stage, String name) {
final NumberAxis xAxisIntensity = new NumberAxis(); //Dichiarazione asseX
final NumberAxis yAxisIntensity = new NumberAxis();//Dichiarazione asseY

DetectionS1.countS1();

//Dichiarazione del tipo di grafico
final LineChart<Number, Number> lineChartIntensity = new LineChart<Number, Number>(xAxisIntensity,yAxisIntensity);

ArrayList<Double> extractedData; //Lista dei valori dello dell' intensità
ArrayList<Double> extractedTime; //Lista del tempo
ArrayList<Double> extractedS1; //Lista del tempo
ArrayList<Double> extractedS1Time; //Lista del tempo

//Gestione e settaggio del grafico
lineChartIntensity.getData().clear();

try {
//Popolamento delle liste
extractedTime = IntensityExtractor.pointsTime();
extractedData = IntensityExtractor.pointsIntensity();
extractedS1 = DetectionS1.S1pitch();
extractedS1Time = DetectionS1.pointsS1Time();
XYChart.Series<Number, Number> series = new XYChart.Series<Number, Number>();
XYChart.Series<Number, Number> seriesS1 = new XYChart.Series<Number, Number>(); //Creazione seconda serie
series.setName("Intensità di:\t" + name.toUpperCase());

for (int j = 0; j < extractedS1.size(); j++) {
seriesS1.getData().add(new XYChart.Data<Number, Number>(extractedS1Time.get(j), extractedS1.get(j)));
lineChartIntensity.getStyleClass().add("CSSintensity");
}

//Creazione finestra e stampa del grafico
Scene scene = new Scene(lineChartIntensity, 1000, 600);
lineChartIntensity.getData().addAll(series,seriesS1);
scene.getStylesheets().add("application/application.css");
stage.setScene(scene);
stage.show();
} catch (java.lang.Exception e) {
e.printStackTrace();
}
}
}

有人也知道我该怎么做吗?

提前谢谢大家。

最佳答案

这是一个老问题,有一个公认的答案,但我遇到了它并且很好奇。我想知道是否可以在 LineChart 中添加间隙(至少无需创建自定义图表实现)。事实证明是有的。该解决方案有点老套且脆弱。它涉及获取 Path通过使用 XYChart.Series.getNode()并操作 PathElement 的列表s。下面的代码给出了一个例子:

import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.XYChart;
import javafx.scene.layout.StackPane;
import javafx.scene.shape.LineTo;
import javafx.scene.shape.MoveTo;
import javafx.scene.shape.Path;
import javafx.stage.Stage;

public class Main extends Application {

@Override
public void start(Stage primaryStage) {
LineChart<Number, Number> chart = new LineChart<>(new NumberAxis(), new NumberAxis());
chart.getXAxis().setLabel("X");
chart.getYAxis().setLabel("Y");
chart.setLegendVisible(false);
chart.getData().add(new XYChart.Series<>());

for (int x = 0; x <= 10; x++) {
chart.getData().get(0).getData().add(new XYChart.Data<>(x, Math.pow(x, 2)));
}

/*
* Had to wrap the call in a Platform.runLater otherwise the Path was
* redrawn after the modifications are made.
*/
primaryStage.setOnShown(we -> Platform.runLater(() -> {
Path path = (Path) chart.getData().get(0).getNode();
LineTo lineTo = (LineTo) path.getElements().get(8);
path.getElements().set(8, new MoveTo(lineTo.getX(), lineTo.getY()));
}));

primaryStage.setScene(new Scene(new StackPane(chart), 500, 300));
primaryStage.setTitle("LineChart Gap");
primaryStage.show();
}

}

此代码产生以下结果:

Screenshot of LineChart with gap in the line

这是可能的,因为 PathElementObservableList 似乎是 MoveTo接下来是一堆LineTo s。我只是选择了一个 LineTo 并将其替换为 MoveTo 到相同的坐标。然而,我还没有完全弄清楚 LineTo 的哪个索引与哪个 XYChart.Data 匹配,并随机选择了 8 作为示例。

此解决方案存在几个问题。第一个也是明显的一点是,这依赖于 LineChart 的内部实现。第二个是真正的脆弱性的来源。对数据的任何更改,无论是坐标轴的值范围、图表的宽度或高度,还是导致图表自身重绘的几乎任何内容都会导致重新计算路径并重新绘制。这意味着,如果您使用此解决方案,则每次图表重新绘制时都必须重新应用修改。

关于javafx - LineChart FX - 删除实线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42424166/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com