Я пытаюсь использовать ScatterChart или LineChart для составления диаграммы Ганта. У меня есть серия событий, и я бы хотел, чтобы линия соединяла начальную и конечную точки каждого события. Ось x будет временем, а ось y будет возрастающим индексом. Другими словами, если событие 1 от t = 1 до t = 5, а событие 2 от t = 3 до t = 10, я бы хотел соединить точки (1,1) и (5,1),и (3,2) и (10,2), и никаких других.
В другом месте в StackOverflow есть реализация диаграммы Ганта, с которой я начинал, но она необычайно медленная при попытке построить десятьтысячи событий.
Я знаю, что одним из решений было бы иметь XYChart.Series для каждого события, чтобы для 1000 событий вход данных для диаграммы состоял из 1000 XYChart.Series, каждый из которых содержит 2 XYChart. Объекты данных. Но по стилю это было бы невозможно, так как я хочу, чтобы здесь было несколько серий с разными цветами.
Есть ли здесь простое решение? Я знаю, что в худшем случае я могу сделать это с помощью Paths, хотя я не уверен, каким образом мне придется исследовать это, но я не уверен, является ли это лучшим решением.
РЕДАКТИРОВАТЬ:Ниже приведены примеры того, что я пытаюсь сделать. Я хочу, чтобы что-то выглядело так, но без вертикальных линий;Я хочу, чтобы они были отключены.
РЕДАКТИРОВАТЬ РЕДАКТИРОВАТЬ: Я изменил точки данных, чтобы они могли перекрывать друг друга, для другого аспекта требований. Я добавил политику, чтобы не сортировать точки ввода для линейного графика. Это не требуется или не подходит для случая, когда это точечная диаграмма, поэтому, если вы идете туда-сюда, вам нужно закомментировать строку chart.setAxisSortingPolicy(LineChart.SortingPolicy.NONE);
Вот исходный код. Переход от одного к другому так же прост, как замена LineChart
на ScatterChart
(и комментирование упомянутой выше строки):
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.chart.LineChart;
import javafx.scene.chart.NumberAxis;
import javafx.scene.chart.ScatterChart;
import javafx.scene.chart.XYChart.Data;
import javafx.scene.chart.XYChart.Series;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class DummyGanttLineChartApp extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
ObservableList<Data<Number, Number>> dataList1 = FXCollections.observableArrayList();
ObservableList<Data<Number, Number>> dataList2 = FXCollections.observableArrayList();
dataList1.add(new Data<Number, Number>(1, 1));
dataList1.add(new Data<Number, Number>(2, 1));
dataList1.add(new Data<Number, Number>(1.5, 2));
dataList1.add(new Data<Number, Number>(2.5, 2));
dataList1.add(new Data<Number, Number>(2, 3));
dataList1.add(new Data<Number, Number>(3, 3));
dataList2.add(new Data<Number, Number>(1.5, 4));
dataList2.add(new Data<Number, Number>(2.5, 4));
dataList2.add(new Data<Number, Number>(2, 5));
dataList2.add(new Data<Number, Number>(3, 5));
dataList2.add(new Data<Number, Number>(2.5, 6));
dataList2.add(new Data<Number, Number>(3.5, 6));
Series<Number, Number> series1 = new Series<Number, Number>("List 1", dataList1);
Series<Number, Number> series2 = new Series<Number, Number>("List 2", dataList2);
ObservableList<Series<Number, Number>> data = FXCollections.observableArrayList();
data.add(series1);
data.add(series2);
NumberAxis xAxis = new NumberAxis();
NumberAxis yAxis = new NumberAxis();
xAxis.autoRangingProperty().set(false);
xAxis.setLowerBound(0);
xAxis.setUpperBound(5);
LineChart<Number, Number> chart = new LineChart<Number, Number>(xAxis, yAxis);
chart.setAxisSortingPolicy(LineChart.SortingPolicy.NONE);
chart.getData().addAll(data);
VBox box = new VBox(10);
box.getChildren().add(chart);
primaryStage.setScene(new Scene(box));
primaryStage.show();
}
}
Это отдельный класс, который фактически запускает это (обходной путь длякакая-то странность с моей настройкой. Вы должны иметь возможность использовать метод main внутри DummyGanttLineChartApp
, но я получаю ошибку). Не беспокойся об этом.
import javafx.application.Application;
public class DummyGanttLineChart {
public static void main(String [] args) {
Application.launch(DummyGanttLineChartApp.class, args);
}
}