JavaFX-StackedBarChart с группами

Я хочу создать StackedBarChart с группами, но не нашел способа это сделать. У меня вот так:

public class TestStackedBarChart extends Application {

public static void main(String[] args) {
    launch(args);
}
@Override
public void start(Stage primaryStage) {
    Group root = new Group();

    final CategoryAxis xAxis = new CategoryAxis();
    final NumberAxis yAxis = new NumberAxis();

    xAxis.setLabel("Month");
    xAxis.setCategories(FXCollections.<String> observableArrayList(Arrays.asList(
            "January", 
            "February",
            "March")));
    yAxis.setLabel("Value");

    final StackedBarChart<String,Number> stackedBarChart = new StackedBarChart<>(xAxis,yAxis);
    stackedBarChart.setTitle("StackedBarChart");

    XYChart.Series<String,Number> series1 = new Series<>();
    series1.setName("XYChart.Series 1");       

    series1.getData().add(new Data<String, Number>("January", Integer.valueOf(100)));
    series1.getData().add(new Data<String, Number>("February", Integer.valueOf(200)));
    series1.getData().add(new Data<String, Number>("March", Integer.valueOf(50)));

    XYChart.Series<String,Number> series2 = new Series<>();
    series2.setName("XYChart.Series 2");

    series2.getData().add(new Data<String, Number>("January", Integer.valueOf(150)));
    series2.getData().add(new Data<String, Number>("February", Integer.valueOf(100)));
    series2.getData().add(new Data<String, Number>("March", Integer.valueOf(60)));

    stackedBarChart.getData().add(series1);
    stackedBarChart.getData().add(series2);

    root.getChildren().addAll(stackedBarChart);

    primaryStage.setScene(new Scene(root, 500, 400));
    primaryStage.show();
}
}

И вот результат:

StackedBarChart (фактическое)

Я хочу иметь что-то вроде этого:

StackedBarChart (Цель)

Есть ли способ сделать это в JavaFx? Вы также можете предложить любой другой тип диаграммы, но решение должно быть с JavaFX.


person Endery    schedule 04.05.2016    source источник
comment
Если я не ошибаюсь, XYChart.series является продолжением региона, что означает, что он должен иметь отступ. Чтобы создать несколько баров за месяц, перейдите по ссылке. . Обратите внимание, что у меня не так много BarCharts, только для небольшого графика, поэтому я могу ошибаться. Но решение будет заключаться в том, чтобы последовать примеру оракула, а затем удалить отступы из полос, где вы не хотите пробелов.   -  person namlik    schedule 04.05.2016
comment
@namlik Я думаю, вы неправильно истолковали то, что я ищу. Я ищу решение для группировки элементов, например Product1,2,3-›Grouped in January. Прокладка не имеет ничего общего с моим вопросом.   -  person Endery    schedule 04.05.2016
comment
Ну разве по ссылке не показан пример того, как это делается? первый пример группирует столбцы по странам. Возможно, вы просмотрели это из-за стены текста, обычно, если вы комбинируете методы и примеры, приведенные там, вы сможете найти решение, которое вас устраивает здесь --› КЛИК ЗДЕСЬ   -  person namlik    schedule 04.05.2016
comment
@namlik Я видел эту ссылку. Но нет ни одного примера того, как это делается.   -  person Endery    schedule 04.05.2016
comment
я должен извиниться, я думал, что можно вложить диаграммы, тем самым создавая желаемый результат. После тестирования и попытки построить пример я не нашел способа сделать то, что я считал возможным. Эта функция, похоже, отсутствует в javafx, поскольку я нигде не могу найти пример того, как это делается. Возможно, другие люди могут помочь вам в дальнейшем.   -  person namlik    schedule 04.05.2016


Ответы (1)


Поэкспериментировав некоторое время с гистограммой с накоплением, я нашел приемлемое для меня решение. Невозможно было сгруппировать сложенные столбчатые узлы, но можно было отсортировать их таким образом, чтобы сгруппированные записи оставались рядом. Вот результат:

StackedBarChart с сортировкой

И вот как я это сделал:

public class TestStackedBarChart extends Application {

public static void main(String[] args) {
    launch(args);
}
@Override
public void start(Stage primaryStage) {
    Group root = new Group();

    final CategoryAxis xAxis = new CategoryAxis();
    final NumberAxis yAxis = new NumberAxis();

    xAxis.setLabel("Month");
    xAxis.setCategories(FXCollections.<String> observableArrayList(Arrays.asList(
            "January(Plan)", 
            "January(Actual)",
            "February(Plan)",
            "February(Actual)",
            "March(Plan)",
            "March(Actual)")));
    yAxis.setLabel("Value");


    final StackedBarChart<String,Number> stackedBarChart = new StackedBarChart<>(xAxis,yAxis);
    stackedBarChart.setTitle("StackedBarChart");        

    XYChart.Series<String,Number> series1 = new Series<>();
    series1.setName("Category A");
    series1.getData().add(new Data<>("January(Plan)", Integer.valueOf(100)));
    series1.getData().add(new Data<>("February(Plan)", Integer.valueOf(200)));
    series1.getData().add(new Data<>("March(Plan)", Integer.valueOf(50)));

    XYChart.Series<String,Number> series2 = new Series<>();
    series2.setName("Category B");  
    series2.getData().add(new Data<>("January(Plan)", Integer.valueOf(200)));
    series2.getData().add(new Data<>("February(Plan)", Integer.valueOf(100)));
    series2.getData().add(new Data<>("March(Plan)", Integer.valueOf(25)));        

    XYChart.Series<String,Number> series3 = new Series<>();
    series3.setName("Actual Value");           
    series3.getData().add(new Data<String, Number>("January(Actual)", Integer.valueOf(250)));
    series3.getData().add(new Data<String, Number>("February(Actual)", Integer.valueOf(275)));
    series3.getData().add(new Data<String, Number>("March(Actual)", Integer.valueOf(60)));

    stackedBarChart.getData().add(series1);
    stackedBarChart.getData().add(series2);
    stackedBarChart.getData().add(series3);

    root.getChildren().addAll(stackedBarChart);

    primaryStage.setScene(new Scene(root, 500, 400));
    primaryStage.show();
}
}
person Endery    schedule 13.06.2016