我对LineChart JavaFX图形有疑问。

我有这张图:
javafx - LineChart FX-删除实线-LMLPHP
点在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的列表。以下代码给出了一个示例:

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();
    }

}


此代码导致以下结果:

javafx - LineChart FX-删除实线-LMLPHP

这是可能的,因为ObservableListPathElement似乎是MoveTo,后跟一堆LineTo。我只是选择了LineTo并用MoveTo替换为相同的坐标。但是,我还没有弄清楚LineTo的哪个索引与哪个XYChart.Data匹配,并为示例随机选择了8

此解决方案有两个问题。第一个显而易见的是,这依赖于LineChart的内部实现。第二个是真正的脆性来自何处。数据的任何更改(轴的值范围,图表的宽度或高度)或几乎任何导致图表重新绘制的东西都会导致重新计算Path并重新绘制。这意味着,如果使用此解决方案,则每次图表重绘时都必须重新应用修改。

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

10-13 01:18