Re *_*ale 2 javafx linechart line
我对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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
有人对我该怎么办也有一点想法?
谢谢大家。
这是一个古老的问题,答案是可以接受的,但我遇到了这个问题,很好奇。我想知道是否有可能在LineChart(至少不必创建自定义图表实现)中留出空隙。原来有。该解决方案有点笨拙。它涉及Path通过使用XYChart.Series.getNode()和操作PathElements 的列表来获取。以下代码给出了一个示例:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
此代码导致以下结果:
这是可能的,因为ObservableList的PathElement小号似乎一个MoveTo接着一堆LineTo秒。我只是选择了一个,LineTo然后将其替换MoveTo为相同的坐标。我还没有弄清楚LineTo与哪个匹配的索引XYChart.Data,而是8随机选择了该示例。
此解决方案有两个问题。第一个显而易见的是,这依赖于的内部实现LineChart。第二个是真正的脆性来自何处。数据的任何更改(轴的值范围,图表的宽度或高度)或几乎任何导致图表重新绘制的东西都会导致Path重新计算和重新绘制。这意味着,如果使用此解决方案,则每次图表重绘时都必须重新应用修改。
| 归档时间: |
|
| 查看次数: |
396 次 |
| 最近记录: |