我对LineChart JavaFX图形有疑问。
我有这张图:
点在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();
}
}
此代码导致以下结果:
这是可能的,因为
ObservableList
的PathElement
似乎是MoveTo
,后跟一堆LineTo
。我只是选择了LineTo
并用MoveTo
替换为相同的坐标。但是,我还没有弄清楚LineTo
的哪个索引与哪个XYChart.Data
匹配,并为示例随机选择了8
。此解决方案有两个问题。第一个显而易见的是,这依赖于
LineChart
的内部实现。第二个是真正的脆性来自何处。数据的任何更改(轴的值范围,图表的宽度或高度)或几乎任何导致图表重新绘制的东西都会导致重新计算Path
并重新绘制。这意味着,如果使用此解决方案,则每次图表重绘时都必须重新应用修改。关于javafx - LineChart FX-删除实线,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42424166/